python多线程简单功能示例
发布时间:2019-11-27 23:08:33
作者:ynkulusi
多线程例子,参考学习用。修改过一次,复杂了些,多跑几次更能理解相关功能。
运行测试结果,每次结果都不同。
#!/usr/bin/env python
import threading
import time
from random import randint
#print time.strftime('%Y.%m.%d',time.localtime(time.time()))
print("主程序启动时间:%s"%(time.ctime()))
def function(i):
sleep_time = randint(1,5)
time.sleep(sleep_time) #子线程会同步启动,为了区分,每个子线程延迟一个随机秒数.
if i in [1, 4]:
print('-'*3+"Start第%s个子线程%s,设定为守护线程,启动后睡眠了%s秒,开始工作时间是:%s"%(i+1,threading.current_thread().name,sleep_time,time.st
rftime('%H:%M:%S')))
elif i == 2:
print('-'*3+"Start第%s个子线程%s,阻塞了主线程1秒,启动后睡眠了%s秒,开始工作时间是:%s"%(i+1,threading.current_thread().name,sleep_time,time.s
trftime('%H:%M:%S')))
elif i == 3:
print('-'*3+"Start第%s个子线程%s,阻塞主线程到本子线程运行结束,启动后睡眠了%s秒,开始工作时间是:%s"%(i+1,threading.current_thread().name,slee
p_time,time.strftime('%H:%M:%S')))
else:
print('-'*3+"Start第%s个子线程%s,启动后睡眠了%s秒,开始工作时间是:%s"%(i+1,threading.current_thread().name,sleep_time,time.strftime('%H:%M:%
S')))
run_time = randint(3,10)
time.sleep(run_time) #模拟子线程运行一个随机时长
print('*'*3+"End第%s个子线程,工作了%s秒,结束时间是:%s"%(i+1,run_time,time.strftime('%H:%M:%S')))
# 列表解析生成5个子线程列表
threads=[threading.Thread(target=function,name='worker_'+str(i+1),args=(i,) ) for i in range(5)]
#print(threads)
#print(threads[2])
print('#'*3+"同步启动子线程.开始启动时间是:%s"%(time.strftime('%H:%M:%S')))
for i,t in enumerate(threads):
if i == 0:
t.start() #该子线程能正常运行到结束,不受主线程是否结束影响.
elif i == 2:
t.start()
t.join(1) #阻塞主线程及后面的for循环1秒,join给定时间参数,就阻塞相应的秒数,没给定就阻塞到当前子线程终止.
elif i == 3:
t.start()
t.join() #阻塞主线程,使与当前子线程同步,需等当前子线程结束后才可以回到主线程继续后面的for循环.
else:
t.setDaemon(True) #设置主线程为守护线程,即主线程结束时,该子线程也立马结束,若还未启动,则不会启动;该设置需要在start()之前设置.
t.start()
print("我是主线程,回到主线程时间是:%s"%(time.ctime()))
运行测试结果,每次结果都不同。
$ ./python_threading_join.py
主程序启动时间:Thu Nov 28 23:10:21 2019
###同步启动子线程.开始启动时间是:23:10:21
---Start第2个子线程worker_2,设定为守护线程,启动后睡眠了1秒,开始工作时间是:23:10:22
---Start第3个子线程worker_3,阻塞了主线程1秒,启动后睡眠了1秒,开始工作时间是:23:10:22
---Start第1个子线程worker_1,启动后睡眠了5秒,开始工作时间是:23:10:26
---Start第4个子线程worker_4,阻塞主线程到本子线程运行结束,启动后睡眠了4秒,开始工作时间是:23:10:26
***End第2个子线程,工作了7秒,结束时间是:23:10:29
***End第3个子线程,工作了7秒,结束时间是:23:10:29
***End第4个子线程,工作了4秒,结束时间是:23:10:30
我是主线程,回到主线程时间是:Thu Nov 28 23:10:30 2019
---Start第5个子线程worker_5,设定为守护线程,启动后睡眠了2秒,开始工作时间是:23:10:32
***End第1个子线程,工作了10秒,结束时间是:23:10:36
分类:python
评论数:1
阅读数:938
-
2019-11-27 23:19:511运行结果贴上,可以自己改动写地方再运行理解.
$ ./python_threading_join.py
主程序启动时间:Wed Nov 27 23:18:47 2019
###同步启动全部子线程.启动时间是:23:18:47
---我是第1个子线程,启动后睡眠了0秒,开始运行时间是:23:18:47
***结束第1个子线程,运行了0秒,结束时间是:23:18:47
---我是第2个子线程,启动后睡眠了1秒,开始运行时间是:23:18:48
---我是第3个子线程,启动后睡眠了2秒,开始运行时间是:23:18:49
---我是第4个子线程,启动后睡眠了3秒,开始运行时间是:23:18:50
我是主线程,被第2个子线程阻塞了3秒,回到主线程时间是:Wed Nov 27 23:18:50 2019
***结束第2个子线程,运行了2秒,结束时间是:23:18:50