Python信号量永远挂起

时间:2014-03-23 20:20:14

标签: python multithreading semaphore

我试图在我的程序中同时执行操作并限制同时打开的进程数(10)。

from multiprocessing import Process
from threading import BoundedSemaphore

semaphore = BoundedSemaphore(10)
for x in xrange(100000):
  semaphore.acquire(blocking=True)
  print 'new'
  p = Process(target=f, args=(x,))
  p.start()

def f(x):
  ...  # do some work
  semaphore.release()
  print 'done'

前10个进程启动并正确结束(我在控制台上看到10个“新”和“完成”),然后什么都没有。我没有看到另一个“新”,程序只挂在那里(而且Ctrl-C也不起作用)。怎么了?

2 个答案:

答案 0 :(得分:2)

您的问题是跨越流程边界使用threading.BoundedSemaphore

import threading
import multiprocessing
import time

semaphore = threading.BoundedSemaphore(10)


def f(x):
  semaphore.release()
  print('done')


semaphore.acquire(blocking=True)
print('new')
print(semaphore._value)
p = multiprocessing.Process(target=f, args=(100,))
p.start()
time.sleep(3)
print(semaphore._value)

创建新进程时,子进程将获取父进程内存的副本。因此,孩子正在递减它的信号量,并且父母的信号量不受影响。 (通常,流程彼此隔离:跨流程进行通信需要一些额外的工作;这是multiprocessing的用途。)

这与两个线程共享内存空间的线程相对,并且被认为是相同的进程。

multiprocessing.BoundedSemaphore可能就是你想要的。 (如果用它替换threading.BoundedSemaphore,并用semaphore.get_value()替换semaphore._value,你会看到上面的输出变化。)

答案 1 :(得分:0)

在生成的各个进程之间不能正确共享您的有界信号量;您可能想切换到使用multiprocessing.BoundedSemaphore。有关更多详细信息,请参阅this question的答案。