如果其中一个进程将全局 "stop" 变量更改为 True,如何停止所有进程
How to stop all processes if one of them changes a global "stop" variable to True
import multiprocessing
global stop
stop = False
def makeprocesses():
processes = []
for _ in range(50):
p = multiprocessing.Process(target=runprocess)
processes.append(p)
for _ in range(50):
processes[_].start()
runprocess()
def runprocess():
global stop
while stop == False:
x = 1 #do something here
if x = 1:
stop = True
makeprocesses()
while stop == True:
x = 0
makeprocesses()
如果只有一个更改为 True,我如何才能让所有其他 49 个进程停止?
我认为,因为停止是一个全局变量,一旦一个进程更改停止,所有其他进程都会停止。
没有。每个进程都有自己的副本。它对脚本是全局的,但不是跨进程的。请记住,每个进程都有一个完全独立的地址space。它获取第一个进程数据的副本。
如果您需要跨进程通信,则需要使用多处理文档 (https://docs.python.org/3/library/multiprocessing.html#synchronization-primitives) 中的同步技术之一,例如事件或共享对象。
无论何时你想要同步线程,你都需要一些共享上下文并确保它是安全的。正如@Tim Roberts 提到的,这些可以取自 (https://docs.python.org/3/library/multiprocessing.html#synchronization-primitives)
尝试这样的事情:
import multiprocessing
from multiprocessing import Event
from time import sleep
def makeprocesses():
processes = []
e = Event()
for i in range(50):
p = multiprocessing.Process(target=runprocess,args= (e,i))
p.start()
processes.append(p)
for p in processes:
p.join()
def runprocess(e: Event() = None,name = 0):
while not e.is_set():
sleep(1)
if name == 1:
e.set() # here we make all other processes to stop
print("end")
if __name__ == '__main__':
makeprocesses()
我最喜欢的方法是使用取消令牌,它是一个包装我们在这里所做的事情的对象
import multiprocessing
global stop
stop = False
def makeprocesses():
processes = []
for _ in range(50):
p = multiprocessing.Process(target=runprocess)
processes.append(p)
for _ in range(50):
processes[_].start()
runprocess()
def runprocess():
global stop
while stop == False:
x = 1 #do something here
if x = 1:
stop = True
makeprocesses()
while stop == True:
x = 0
makeprocesses()
如果只有一个更改为 True,我如何才能让所有其他 49 个进程停止? 我认为,因为停止是一个全局变量,一旦一个进程更改停止,所有其他进程都会停止。
没有。每个进程都有自己的副本。它对脚本是全局的,但不是跨进程的。请记住,每个进程都有一个完全独立的地址space。它获取第一个进程数据的副本。
如果您需要跨进程通信,则需要使用多处理文档 (https://docs.python.org/3/library/multiprocessing.html#synchronization-primitives) 中的同步技术之一,例如事件或共享对象。
无论何时你想要同步线程,你都需要一些共享上下文并确保它是安全的。正如@Tim Roberts 提到的,这些可以取自 (https://docs.python.org/3/library/multiprocessing.html#synchronization-primitives)
尝试这样的事情:
import multiprocessing
from multiprocessing import Event
from time import sleep
def makeprocesses():
processes = []
e = Event()
for i in range(50):
p = multiprocessing.Process(target=runprocess,args= (e,i))
p.start()
processes.append(p)
for p in processes:
p.join()
def runprocess(e: Event() = None,name = 0):
while not e.is_set():
sleep(1)
if name == 1:
e.set() # here we make all other processes to stop
print("end")
if __name__ == '__main__':
makeprocesses()
我最喜欢的方法是使用取消令牌,它是一个包装我们在这里所做的事情的对象