python⼦线程如何有序执⾏
⼀、前情提要
最近在写⼀个项⽬,需要⽤到⼦线程,但是我们⼩学⼆年级就学过操作系统,线程的执⾏是由系统的CPU调度算法所决定的,调度算法按照⼀系列的要求来从就绪队列中选择合适的线程分配CPU资源。
⼆、场景重现
好了,换句话说,线程的执⾏顺序是不确定的。来个python代码我们看⼀下:
import threading
def fun():
'''执⾏函数'''
print(threading.current_thread().getName()+' 正在执⾏!')
# 线程队列
ths = []
for i in range(10):
ths.append(threading.Thread(target=fun))
# 依次启动线程
for th in ths:
th.start()
看⼀下效果:
不难看出,虽然第⼀次运⾏的结果时有序执⾏⼦线程,但是后续重复运⾏程序的结果,显然是顺序不确定的,这就正好体现了线程的随机性。
那么我们在某种特殊的场景下,我们需要让⼦线程按照顺序有序执⾏,那改怎么做呢?
三、解决⽅案(⼀)
通过查询threading API我们可以发现⼀个这样的函数:
Thread.join(timeout=None)
该⽅法的作⽤是等待当前执⾏线程终⽌
也就是说,哦那我调⽤start()⽅法开始线程之后,再调⽤这个⽅法不就⾏了吗?答案是肯定的
import threading
print(threading.current_thread().getName()+' 正在执⾏!')
# 线程队列
selenium怎么使用ths = []
for i in range(10):
ths.append(threading.Thread(target=fun))
# 依次启动线程
for th in ths:
th.start()
th.join()
看⼀下效果:
这时候我们发现,不管如何运⾏⼦线程的执⾏顺序都是有序的
四、解决⽅案(⼆)
就这⼀种⽅法吗?当然不是的,⽽且上⾯那种⽅法,如果是控制台界⾯是没有问题的,但是如果是GUI界⾯,那就由⼤问题了。那么我们再想想join()⽅法,还可以换种⽅法⽤吗?
我们可以⽤⼀个⼩技巧,可以将上⼀个线程传⼊target,
在函数中判断,如果上⼀个线程还在执⾏,那么就调⽤join()⽅法等待其执⾏,等待执⾏完毕后,再让当前线程执⾏。
代码:
import threading
def fun(preThread):
'''执⾏函数'''
# 等待上⼀个线程执⾏完毕
if preThread != None:
preThread.join()
# 执⾏当前线程
print(threading.current_thread().getName()+' 正在执⾏!')
# 线程队列
ths = []
for i in range(10):
if i == 0:
ths.append(threading.Thread(target=fun, args=(None, )))
else :
ths.append(threading.Thread(target=fun, args=(ths[-1], )))
# 依次启动线程
for th in ths:
这个时候,我们发现,⼦线程的执⾏顺序也是有序的!Nice!
五、结束
通过以上两种解决⽅案,完美解决这个问题!
到此这篇关于python⼦线程如何有序执⾏的⽂章就介绍到这了,更多相关python⼦线程有序执⾏内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章
希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。