代码之家  ›  专栏  ›  技术社区  ›  JoeVictor

python同时填充列表

  •  2
  • JoeVictor  · 技术社区  · 6 年前

    因此,我正在尝试编写多进程代码,希望能够根据正在运行的一些进程填充一个列表。但它根本没有修改列表。

    现在我知道我不能访问同一个元素并从多个线程增加它,因为它将导致竞争条件。但我所拥有的代码是从一个并且只有一个进程访问一个索引的代码。例如,如果我有一个包含4个元素的列表,我会运行4个进程,每个元素一个进程。但是,这不起作用。即使我读到这些列表被认为是线程安全的。

    我写了一个小程序来演示我的问题:

    from multiprocessing import Process
    
    list = [0,0,0,0]
    
    def incrAt(idx):
        list[idx] += 1
    
    
    p0 =  Process(target = incrAt, args=(0,))
    p1 =  Process(target = incrAt, args=(1,))
    p2 =  Process(target = incrAt, args=(2,))
    p3 =  Process(target = incrAt, args=(3,))
    
    p0.start()
    p1.start()
    p2.start()
    p3.start()
    
    # Do stuff while we wait...
    
    p0.join()
    p1.join()
    p2.join()
    p3.join()
    
    
    print(list) # should print [1,1,1,1] but prints [0,0,0,0]
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Sushant    6 年前

    这是因为全局变量不在进程之间共享。

    使用 multiprocessing.Manager.list -

    from multiprocessing import Process, Manager
    
    def incrAt(idx, lis):
        lis[idx] += 1
    with Manager() as manager:
        lis = manager.list([0, 0, 0, 0])
        p0 =  Process(target = incrAt, args=(0,lis))
    

    将列表从list重命名为lis,因为list是python内置的