借用虫师的多线程示例,了解多线程的概念。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
def music():
for i in range(1, 3):
print 'music ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
time.sleep(10)
print 'music' + str(i)
def sig():
for i in range(1, 3):
print 'sig ' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
time.sleep(2)
print 'sig' + str(i)
def thread():
threads = []
t1 = threading.Thread(target=music, args=())
threads.append(t1)
t2 = threading.Thread(target=sig, args=())
threads.append(t2)
for t in threads:
t.start()
for t in threads:
t.join()
if __name__ == '__main__':
thread()
print 'xxxxx'
# 首先明确jion的作用,是可以控制等待子线程执行完成后,程序才会终止。
# #三种写法:
# 错误方式一:
for t in threads:
t.setDaemon(True)
t.start()
t.join()
join在for循环里面,实际测试结果,还是按照顺序执行,非并发执行。原因:jion放到里面,实际运行是在循环内 非要等到t1子线程执行完成后,才会进行下一步。可增加打印验证
# for t in threads: # t.setDaemon(True) # t.start() # print 'xxxx' # t.join() # print 'wwww'
错误方式二:
for t in threads:
t.setDaemon(True)
t.start()
t.join()
for循环,是只要成功对t赋值,调用music和sig即可,不会关心赋值调用的函数是否运行完成。运行完for循环后,t的值最终是t2,故t2子线程结束后,父线程就会回阻塞。但父线程运行的没有下一个,及join下面是空,所以中止。
但是t1子线程运行时间大于t2.所以提前中止后,t1就无法执行了
正确方式:
for t in threads:
t.start()
for t in threads:
t.join()
这个循环只是for循环开启了t1.start\t2.start\t1.join\t2.join,4个函数调用。