当前位置: 代码迷 >> python >> Python的信号量永远挂起
  详细解决方案

Python的信号量永远挂起

热度:76   发布时间:2023-07-16 09:56:15.0

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

您的问题是跨进程边界使用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 ,您将看到上面的输出更改。)

您的有界信号量在正在生成的各个进程之间无法正确共享; 您可能要切换到使用 。 有关更多详细信息,请参见此的答案。