【问题标题】:How to stop all processes if one of them changes a global "stop" variable to True如果其中一个将全局“停止”变量更改为 True,如何停止所有进程
【发布时间】:2021-12-29 04:12:36
【问题描述】:
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 个进程停止? 我认为,由于 stop 是一个全局变量,因此一旦一个进程更改停止,所有其他进程都会停止。

【问题讨论】:

    标签: python python-3.x multiprocessing


    【解决方案1】:

    没有。每个进程都有自己的副本。它对脚本是全局的,但不是跨进程的。请记住,每个进程都有一个完全独立的地址空间。它获取第一个进程数据的副本。

    如果您需要跨进程通信,则需要使用多处理文档 (https://docs.python.org/3/library/multiprocessing.html#synchronization-primitives) 中的一种同步技术,例如事件或共享对象。

    【讨论】:

    • 谢谢,这将非常有帮助。
    【解决方案2】:

    当您想要同步线程时,您需要一些共享上下文并确保它是安全的。正如@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()
    

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

    【讨论】:

    • 我需要“p.join()”吗?我真的不明白 .join() 的作用。 Python Docs 说“这会阻塞调用线程,直到调用 join() 方法的线程终止”但是我是否希望调用线程被阻塞?
    • 查看此处以更好地了解 join 的作用stackoverflow.com/questions/25391025/… 您将始终希望使用 join ,因为它会阻塞调用线程(在您的情况下为主线程),直到进程结束。如果您不这样做,那么主线程将在进程完成其工作之前完成。加入线程也最好释放内存并清除线程池(取决于实现)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2022-12-16
    • 2011-06-16
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多