首页 > 解决方案 > python中线程之间的数据通信

问题描述

我是 python 新手,我对 python 中的线程知之甚少。这是我的示例代码。

import threading
from threading import Thread
import time

check = False

def func1():
    print ("funn1 started")
    while check:
        print ("got permission")

def func2():
    global check
    print ("func2 started")
    time.sleep(2)
    check = True
    time.sleep(2)
    check = False

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()

我想要的是看到“得到许可”作为输出。但是使用我当前的代码并没有发生。我假设func1线程在将值func2更改为.checkTrue

我怎样才能func1活下去?我在互联网上进行了研究,但找不到解决方案。任何帮助,将不胜感激。先感谢您!

标签: pythonpython-multithreading

解决方案


这里的问题是 func1 在 while 循环中执行检查,发现它为假,然后终止。所以第一个线程在没有打印“得到许可”的情况下完成。

我不认为这种机制是你正在寻找的。我会选择使用这样的条件,

import threading
from threading import Thread
import time

check = threading.Condition()

def func1():
    print ("funn1 started")
    check.acquire()
    check.wait()
    print ("got permission")
    print ("funn1 finished")


def func2():
    print ("func2 started")
    check.acquire()
    time.sleep(2)
    check.notify()
    check.release()
    time.sleep(2)
    print ("func2 finished")

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()

这里的条件变量在内部使用互斥锁在线程之间进行通信;所以一次只有一个线程可以获取条件变量。第一个函数获取条件变量,然后释放它,但注册它将等待,直到它通过条件变量收到通知。然后第二个线程可以获取条件变量,当它完成了它需要做的事情时,它通知等待线程它可以继续。


推荐阅读