【问题标题】:Pass-by-reference mutable variable in a thread线程中的传递引用可变变量
【发布时间】:2015-02-08 18:50:01
【问题描述】:

我有一个关于 Python 中的多线程的基本问题:我有一个列表,我需要在一个线程中修改它。我知道列表是可变类型:How do I pass a variable by reference?

但是,当我使用线程时,列表的行为不像可变类型:

from multiprocessing import Process, Lock

def f(l, i, n):
    l.acquire()
    i.append(n)
    l.release()
    print "in:", i

if __name__ == '__main__':
    lock = Lock()

    i = []
    for num in range(10):
        p = Process(target=f, args=(lock, i, num))
        p.start()
        p.join()

    print "out:", i

输出

in: [0]
in: [1]
in: [2]
in: [3]
in: [4]
in: [5]
in: [6]
in: [7]
in: [8]
in: [9]
out: []

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python multithreading multiprocessing pass-by-reference


    【解决方案1】:

    您需要加入一个单独的循环。通过在同一个循环中加入连接,它会强制您在启动下一个线程之前等待线程完成。请参阅下面的代码...

    from threading import Thread, Lock  # <----
    
    def f(l, i, n):
        l.acquire()
        i.append(n)
        l.release()
        print "in:", i
    
    if __name__ == '__main__':
        lock = Lock()
    
        i = []
        for num in range(10):
            p = Thread(target=f, args=(lock, i, num))  # <----
            p.start()
            
        for num in range(10):
            p.join()   
    
        print "out:", i

    【讨论】:

      【解决方案2】:

      代码不是使用线程,而是使用不共享内存的进程。

      使用线程:

      from threading import Thread, Lock  # <----
      
      def f(l, i, n):
          l.acquire()
          i.append(n)
          l.release()
          print "in:", i
      
      if __name__ == '__main__':
          lock = Lock()
      
          i = []
          for num in range(10):
              p = Thread(target=f, args=(lock, i, num))  # <----
              p.start()
              p.join()
      
          print "out:", i
      

      【讨论】:

      猜你喜欢
      • 2015-12-21
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多