问题描述
我试图在程序中并发执行操作,并限制同时打开的进程数(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也不起作用)。 怎么了 ?
1楼
您的问题是跨进程边界使用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
,您将看到上面的输出更改。)
2楼
您的有界信号量在正在生成的各个进程之间无法正确共享; 您可能要切换到使用 。 有关更多详细信息,请参见此的答案。