【问题标题】:Shared Array not shared correctly in python multiprocessing共享数组在 python 多处理中未正确共享
【发布时间】:2012-08-07 14:39:51
【问题描述】:

我正在尝试在 Python 中进行多处理,并尝试在两个进程之间共享一个字符串数组。这是我的python代码:

from multiprocessing import Process, Array, Value
import ctypes

def f1(a, v):
    for i, l in enumerate(['a', 'b', 'c']):
        a[i] = l*3

    v.value += 1

    print "f1 : ", a[:], v.value

def f2(a,v):

    v.value += 1

    print "f2 : ", a[:], v.value

if __name__ == '__main__':
    val = Value(ctypes.c_int, 0)
    arr = Array(ctypes.c_char_p, 3)

    print "Before :", arr[:], val.value

    p = Process(target=f1, args=(arr, val))
    p2 = Process(target=f2, args=(arr, val))

    p.start()
    p2.start()

    p.join()
    p2.join()

    print "After : ", arr[:], val.value

当我运行脚本时,我看到arr 已正确填充并且在f1() 中可用,但在f2() 中不可用。结果如下:

    % python /tmp/tests.py
    Before : [None, None, None] 0
    f1 :  ['aaa', 'bbb', 'ccc'] 1
    f2 :  ['\x01', '\x11', '\x01'] 2
    After :  ['\x01', '\x01', '\x01'] 2

我是不是忽略了什么?

提前感谢您的反馈。 :)

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

    我的猜测是:

    arr 存储 3 个指针。 f1() 将它们分配给没有 意思是在当前流程之外。 f2() 尝试访问 此时包含垃圾的无意义地址。

    分配给在所有过程中都有意义的值似乎有帮助:

    from __future__ import print_function
    import ctypes
    import time
    from multiprocessing import Process, Array, Value
    
    values = [(s*4).encode('ascii') for s in 'abc']
    
    def f1(a, v):
        for i, s in enumerate(values):
            a[i] = s
    
        v.value += 1
    
        print("f1 : ", a[:], v.value)
    
    def f2(a,v):
        v.value += 1
        print("f2 : ", a[:], v.value)
    
    def main():
        val = Value(ctypes.c_int, 0)
        arr = Array(ctypes.c_char_p, 3)
    
        print("Before :", arr[:], val.value)
    
        p = Process(target=f1, args=(arr, val))
        p2 = Process(target=f2, args=(arr, val))
    
        p.start()
        p2.start()
    
        p.join()
        p2.join()
    
        print("After : ", arr[:], val.value)
    
    if __name__ == '__main__':
        main()
    

    输出

    Before : [None, None, None] 0
    f1 :  ['aaaa', 'bbbb', 'cccc'] 1
    f2 :  ['aaaa', 'bbbb', 'cccc'] 2
    After :  ['aaaa', 'bbbb', 'cccc'] 2
    

    【讨论】:

      【解决方案2】:

      我没有解决方案,但我可以添加更多提示。 我已经剥离了脚本以查明问题。在我看来,问题出在l * 3 操作中。我不知道为什么,但是在enumerator 中移动l * 3 操作可以按预期工作:

      from multiprocessing import Process, Array                                   
      import ctypes                                                                
      
      
      def f1(a):                                                                   
      #    for i, l in enumerate(['a', 'b', 'c']):                                 
      #        a[i] = (l * 3)                                                      
          for i, l in enumerate(['a' * 3, 'b' * 3, 'c' * 3]):                      
              a[i] = l                                                             
      
          print "f1 : ", map(id, a), a[:]                                          
      
      
      if __name__ == '__main__':                                                   
          arr = Array(ctypes.c_char_p, 3)                                          
      
          print "Before :", map(id, arr), arr[:]                                   
          p = Process(target=f1, args=(arr, ))                                     
          p.start()                                                                
          p.join()                                                                 
          print "After : ", map(id, arr), arr[:]                                   
      

      结果:

      Before : [3077673516L, 3077673516L, 3077673516L] [None, None, None]
      f1 :  [3073497784L, 3073497784L, 3073497784L] ['aaa', 'bbb', 'ccc']
      After :  [3073497784L, 3073497784L, 3073497784L] ['aaa', 'bbb', 'ccc']
      

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 1970-01-01
        • 2021-03-19
        • 2022-10-15
        • 2019-10-09
        • 2020-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多