我如何在多处理中同步列表和整数?

How i can sync list and int in multiprocessings?

我有这样的代码:

urls = []
data = []
data_counter = 0


def get_data(url):
    with requests.Session() as session:
        response = session.get(url, params=params).json()

    items = {
        'A': a,
        'B': b,
        'C': c,
        'D': d,
        'E': e
    }
    data.append(items)

    print('DONE №{}: {}'.format(data_counter, url))


if __name__ == "__main__":
    with Pool() as pool:
        for url in urls:
            pool.apply_async(get_data, (url,))
        pool.close()
        pool.join() 

get()wait() 不起作用,因为每个进程依次运行,而不是同时运行。

那么,我应该怎么做才能让 data 包含来自所有进程的数据并且 counter 显示正确的结果?

当多处理库为您创建新进程时,它会使用一个名为 fork 的操作系统级函数。这将创建一个新进程,该进程仍然可以访问父进程的内存,但只要任何一方更改任何内容,数据都会首先复制到子进程的内存中。这意味着您对子进程中的变量所做的更改不会在父进程中可见,这就是 data 似乎没有更新的原因。

要得到你想要的,你要么需要使用某种形式的共享内存数据结构(查看 multiprocessing.Manager and multiprocessing.Value),要么你需要 return (data, data_counter) 来自 get_data并执行类似以下操作以将其合并到父进程中:

results = list()
for url in urls:
    results.append(pool.apply_async(get_data, (url,)))
for result in results:
    new_data, new_data_counter = result.get()
    data.extend(new_data)
    global data_counter
    data_counter += new_data_counter

(您还需要确保在 get_data 开头清除 data 并将 data_counter 设置为 0 以避免在 extend 中附加重复项并使计数器正常工作。)