gpt4 book ai didi

Python信号量永远挂起

转载 作者:行者123 更新时间:2023-12-01 05:19:59 31 4
gpt4 key购买 nike

我试图在我的程序中同时执行一些操作,并限制同时打开的进程数量 (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 个"new"和“完成”),然后什么也没有。我没有看到另一个"new",程序只是卡在那里(并且 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.BoundedSemaphore 可能就是您想要的。 (如果将 threading.BoundedSemaphore 替换为它,并将 semaphore._value 替换为 semaphore.get_value()`,您将看到上面的输出发生变化。)

关于Python信号量永远挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22596551/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com