我如何在多处理中同步 list 和 int?

知乎

我有这样的代码:

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.Managermultiprocessing.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 C# 中使用 List<List<int>> 和 Return List<List<int>> 进行 GroupBy?

比較python中的list和int

在c#中连接int和list

如何定义可以接受List [List [String]]和List [List [Int]]作为输入的案例类?

同时接受int []和List <int>的方法

如何解决 TypeError: '>' not supported between 'int' 和 'list' 的问题?

它是如何工作的-split,int,nparray和list理解的序列?

Seq [Int]和List [Int]之间的区别和转换

我如何在 java 中从 int[] 转换为 List<Integer>

vector <list <int>>和list <vector <int>>是否相同当我们声明它们时,它们如何保留在内存中?

如何处理 TypeError: 不支持的操作数类型 -: 'list' 和 'int'?

HashSet<int> 和 List<int> 的快速交集

Python:为什么对int和list函数参数进行不同的处理?

如何检查List <List <int >>是否包含List <int>

JSON主体为List <int>,List <decimal>和long

如何在Spring集成中并行和同步处理?

如何修复TypeError:+不支持的操作数类型:“ int”和“ list”

在Python3中将值添加到list和int的元组

F Sharp中的List <int>与int列表

在 Dictionary<int,List<int>> 中查找值

如何总结 Int 和 Int64?

在pygame中我有一个问题:+ =不支持的操作数类型:'int'和'list'

如何将List <KeyValuePair <int,int >>转换为int [] []?

如何按List <int>对List <Type>排序?

如何排序List [Int]对象?

如何在C#中检查HashSet <List <int >>是否包含List <int>的重复值?

在sql List <int>中搜索?

如何在Dict <int,List <Tuple <string,string >>>中查找键,以便列表包含具有给定Item1和Items的元素

如何在int *和enum *之间转换?