我如何在多处理中同步列表和整数?
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
中附加重复项并使计数器正常工作。)
我有这样的代码:
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
中附加重复项并使计数器正常工作。)