如果其中一个进程将全局 "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()

我最喜欢的方法是使用取消令牌,它是一个包装我们在这里所做的事情的对象