python - 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
更改为.check
True
我怎样才能func1
活下去?我在互联网上进行了研究,但找不到解决方案。任何帮助,将不胜感激。先感谢您!
解决方案
这里的问题是 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()
这里的条件变量在内部使用互斥锁在线程之间进行通信;所以一次只有一个线程可以获取条件变量。第一个函数获取条件变量,然后释放它,但注册它将等待,直到它通过条件变量收到通知。然后第二个线程可以获取条件变量,当它完成了它需要做的事情时,它通知等待线程它可以继续。
推荐阅读
- python-3.x - 将 Conv2D 用于图像有什么问题?
- javascript - Nodejs javascript添加到按钮没有响应
- tensorflow - 神经网络在低密度区域的回归精度
- pyspark - 通过 pyspark 和 pycharm 进行 SQLite JDBC 连接的 jar 文件
- django - 如何在 Django 中使用 Vue 模板?
- mysql - 用于 AJAX 网页的 Linux Web 服务器配置高消耗 CPU
- api - Twitter can_dm 在 Web API 上返回 null
- python-3.x - 使用 Python 3 通过 WIFI 将相机从一个 Raspberry Pi 播放到另一个
- javascript - 子组件没有设置从父组件传来的初始值:ReactJS
- excel - 如何在删除最后一个字符的同时复制数组并以双精度获得结果