Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.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 两个多处理机之间的实时通信_Python_Multiprocessing - Fatal编程技术网

Python 两个多处理机之间的实时通信

Python 两个多处理机之间的实时通信,python,multiprocessing,Python,Multiprocessing,我有两个进程,我需要当一个进程发生了什么,另一个进程也会发生什么。 例如: import multiprocessing def function_1(num): while True: status = False for i in range (num): if i == 100: status = True i +=1 def function_2():

我有两个进程,我需要当一个进程发生了什么,另一个进程也会发生什么。 例如:

import multiprocessing


def function_1(num):
    while True:
        status = False
        for i in range (num):
            if i == 100:
                status = True
            i +=1


def function_2():
    while True:
        if status == True:
            print("status changed")

if __name__ == '__main__':
    num = 101
    a = multiprocessing.Process(target=function_1,args=(num,))
    b = multiprocessing.Process(target=function_2)


    a.start()
    b.start()


    a.join()
    b.join()
此代码显然不起作用,如何使其起作用?我不需要一个过程结束然后得到结果,我需要这个过程在那之后继续。。。有办法吗


谢谢大家!

您忘记在
start()
之后添加
.join()
。 试试这个:

a.start()
b.start()

a.join()
b.join()

为了使
函数_2
等待直到
函数_1
达到某个状态,而不是使用共享变量,您可以创建一个
多处理.Queue
实例来传递给这两个函数,并利用
Queue.get
阻塞,直到队列接收到要退出队列的内容,并使
function_1
在队列达到所需状态后将内容放入队列:

import multiprocessing

def function_1(queue, num):
    while True:
        for i in range(num):
            print(i)
            if i == 3:
                queue.put(None)

def function_2(queue):
    queue.get()
    print('do something')

if __name__ == '__main__':
    num = 5
    queue = multiprocessing.Queue()
    a = multiprocessing.Process(target=function_1, args=(queue, num))
    b = multiprocessing.Process(target=function_2, args=(queue,))
    a.start()
    b.start()

谢谢:)我写队列。在函数_1中放入(“某物”),在函数_2中放入:虽然为True:如果不是队列。empty:打印(“执行某物”),但不幸的是,它不起作用:\n你知道为什么吗?你应该通过在函数名后添加括号来调用
empty
方法:
queue.empty()
。请注意,在无限
循环中不断检查队列是否为空,而
循环将不必要地耗费大量CPU时间。如我的回答所示,你应该坚持使用queue.get()
。但我需要不断检查状态是否发生变化,当状态发生变化时,它会导致一些事情,queue.get()只检查一次……我明白了。如果您的状态可以前后翻转,您确实可以在循环中调用
empty
方法,并使
function\u 1
调用
queue。一旦需要暂停
function\u 2
时,获取
。是的
睡眠
肯定会解决CPU使用问题,只要几秒钟的延迟是可以接受的。