我试图在我的程序中同时执行操作并限制同时打开的进程数(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也不起作用)。怎么了?
答案 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的答案。