Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python';s的信号灯永远挂着_Python_Multithreading_Semaphore - Fatal编程技术网

Python';s的信号灯永远挂着

Python';s的信号灯永远挂着,python,multithreading,semaphore,Python,Multithreading,Semaphore,我试图在我的程序中同时做一些事情,并限制同时打开的进程数(10) 前10个进程启动并正确结束(我在控制台上看到10个“新建”和“完成”),然后什么都没有。我没有看到另一个“新”,程序只是挂在那里(而且Ctrl-C也不起作用)。怎么了?您的有界信号量没有在正在生成的各个进程之间正确共享;您可能希望切换到使用。有关更多详细信息,请参阅的答案。您的问题在于跨进程边界使用线程。BoundedSemaphore: import threading import multiprocessing import

我试图在我的程序中同时做一些事情,并限制同时打开的进程数(10)


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

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

您的问题在于跨进程边界使用
线程。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)
创建新进程时,子进程将获得父进程内存的副本。因此,子进程正在减少它的信号量,而父进程中的信号量是不变的。(通常,进程彼此隔离:跨进程通信需要一些额外的工作;这就是多处理的目的。)

这与线程相反,两个线程共享内存空间,并被视为同一进程


多处理。BoundedSemaphore
可能就是您想要的。(如果用它替换
threading.BoundedSemaphore
,并用semaphore.get_value()`替换
semaphore

为什么不直接使用
多处理.Pool
?是什么让你认为
线程化。BoundedSemaphore
发布将跨越进程边界?Thanatos semaphore是一个全局对象,acquire应该像文档中所说的那样被阻塞;“我遗漏了什么吗?”g.d.d.c说,我试过了,我很满意,但我仍然有兴趣知道为什么这不起作用,因为我一开始就看到这个问题似乎不一样。现在有了答案,我看到他使用了
线程。
而不是
多处理。
这就是他问这个问题的原因
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)