【python多线程】2:如何让多个线程一起执行

【python多线程】2:如何让多个线程一起执行,第1张

【python多线程】2:如何让多个线程一起执行

对Thread不太熟悉的朋友,可先行翻阅这个:Python多线程之Thread类

尽管Thread之间实现了多线程 *** 作,但每个Thread.start()的调用仍然有先后顺序。

>>> def printN(n,name=None):
...   for i in range(n): print(f"{name}:{i}")
>>> def test():
...   th1 = Thread(target=printN, args=[3,'th1'])
...   th2 = Thread(target=printN, args=[3,'th2'])
...   th1.start()
...   th2.start()
...
>>> test()
th1:0
th1:1
th1:2
th2:0
th2:1
>>> th2:2

这个测试比较极端,在th2还没开始的时候,th1已经结束了。

Barrier的作用,就是让多个Thread一起开始。其原理是,设置一个栅栏,当start的线程数不够的时候,就把这些线程挡住,直到线程数足够多的时候,再一起执行。

# 导入线程模块
from threading import Thread, Barrier
>>> b = Barrier(3, action=lambda : print("threads start"))
>>> def printN(n, name=None):
...   print(f"{name} ready")
...   b.wait(2)
...   for i in range(n): print(f"{name}:{i}")
...
>>> def test():
...   thName = ['th1','th2','th3']
...   for i in range(3):
...     th = Thread(target=printN, args=[5,thName[i]])
...     th.start()
...
>>> test()
th1 ready
th2 ready
th3 ready
threads start       #执行Barrier中的Action
th3:0
th3:1
th2:0
th1:0
th1:1
th2:1
th2:2
th2:3
th2:4
th3:2
th3:3
th3:4
th1:2
th1:3
th1:4

其中,Barrier的构造函数有三个参量,分别代表阻塞线程数目parties、线程执行之前的执行函数Action以及延时时间。

Barrier类中最重要的函数就是wait,其中的参数代表当前线程的延时时间,如果不设置则表示一直等下去。wait相当于一个标记,当足够多的Barrier都已调用wait,则所有的wait在同一时间结束。

Barrier的运行机制就是,当多达parties个数的Barrier都已调用wait之后,则执行Action,然后终止等待,执行wait之后的内容。

除了wait,Barrier中还有一个reset函数比较重要,可以将当前已经调用wait的线程数置0。

可能是文化差异,Python标准库中很多本来就很直观的功能,偏偏要加上一些奇妙的比喻,反而显得画蛇添足了。而很多中文文档不知道是没看懂还是根本没看,不假思索地直译,甚至是机翻风格的直译,更让人费解。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5436388.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存