我有这样的代码:
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和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
(您还需要确保在开始时data
清除并data_counter
设置为 0,get_data
以避免添加重复项extend
并使计数器正常工作。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句