python - python中线程之间的数据通信

标签 python python-multithreading

我是 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 之前关闭更改 check值到 True .
我怎样才能保持func1活?
我在互联网上进行了研究,但找不到解决方案。
任何帮助,将不胜感激。
先感谢您!

最佳答案

这里的问题是 func1 在 while 循环中执行检查,发现它为 false 并终止。所以第一个线程完成而不打印“获得许可”。

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

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()

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

关于python - python中线程之间的数据通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51242467/

相关文章:

python - Expect 无法生成两个以上的命令

python - 不确定我是否正确运行线程

Python MQTT 回调未调用

python - 为 CTest 测试设置环境变量时遇到问题

python - UWSGI 在 Django 中向管理员登录表单添加双斜杠

python - 在检测到 python 时运行特定代码

python - 我想停止线程时不停止

python - 函数完成后,按钮调用的线程不会退出

python - 清理 1677 年之前日期的不同日期格式时的 Pandas OutOfBoundsDatetime

python - 在Python的另一个类ElementTree中继续解析