多進程和多線程均可以執行多個任務,線程是進程的一部分。線程的特色是線程之間能夠共享內存和變量,資源消耗少(不過在Unix環境中,多進程和多線程資源調度消耗差距不明顯,Unix調度較快),缺點是線程之間的同步和加鎖比較麻煩。多線程
在Python中,一樣能夠實現多線程,有兩個標準模塊thread和threading,不過咱們主要使用更高級的threading模塊。
1、先來看一段代碼app
import threading from time import ctime,sleep def drink(func): for i in range(2): print "I was drink %s. %s" %(func,ctime()) sleep(1) def eat(func): for i in range(2): print "I was eat the %s! %s" %(func,ctime()) sleep(1) threads = [] t1 = threading.Thread(target=drink,args=(u'牛奶',)) threads.append(t1) t2 = threading.Thread(target=eat,args=(u'麪包',)) threads.append(t2) if __name__ == '__main__': for t in threads: t.start() t.join() print "all over %s" %ctime()
結果:ide
I was drink 牛奶. Wed Jan 17 14:13:06 2018 I was eat the 麪包! Wed Jan 17 14:13:06 2018 I was drink 牛奶. Wed Jan 17 14:13:07 2018 I was eat the 麪包! Wed Jan 17 14:13:07 2018 all over Wed Jan 17 14:13:08 2018
start是啓動線程,join是阻塞當前線程,即便得在當前線程結束時,不會退出。線程
Python中,默認狀況下,若是不加join語句,那麼主線程不會等到當前線程結束才結束,但卻不會當即殺死該線程。
不加join結果:code
I was drink 牛奶. Wed Jan 17 14:13:23 2018 I was eat the 麪包! Wed Jan 17 14:13:23 2018 all over Wed Jan 17 14:13:23 2018 I was eat the 麪包! Wed Jan 17 14:13:24 2018I was drink 牛奶. Wed Jan 17 14:13:24 2018
但若是爲線程實例添加t.setDaemon(True)以後,若是不加join語句,那麼當主線程結束以後,會殺死子線程。進程
import threading from time import ctime,sleep def drink(func): for i in range(2): print "I was drink %s. %s" %(func,ctime()) sleep(1) def eat(func): for i in range(2): print "I was eat the %s! %s" %(func,ctime()) sleep(1) threads = [] t1 = threading.Thread(target=drink,args=(u'牛奶',)) threads.append(t1) t2 = threading.Thread(target=eat,args=(u'麪包',)) threads.append(t2) if __name__ == '__main__': for t in threads: t.setDaemon(True) t.start() print "all over %s" %ctime()
不加join結果:內存
I was drink 牛奶. Wed Jan 17 14:10:43 2018 all over Wed Jan 17 14:10:43 2018I was eat the 麪包! Wed Jan 17 14:10:43 2018
若是加上join,並設置等待時間,就會等待線程一段時間再退出。資源
import threading from time import ctime,sleep def drink(func): for i in range(2): print "I was drink %s. %s" %(func,ctime()) sleep(1) def eat(func): for i in range(2): print "I was eat the %s! %s" %(func,ctime()) sleep(1) threads = [] t1 = threading.Thread(target=drink,args=(u'牛奶',)) threads.append(t1) t2 = threading.Thread(target=eat,args=(u'麪包',)) threads.append(t2) if __name__ == '__main__': for t in threads: t.setDaemon(True) t.start() t.join(0.1) print "all over %s" %ctime()
這裏設置爲0.1秒結果以下:get
I was drink 牛奶. Wed Jan 17 14:11:08 2018 I was eat the 麪包! Wed Jan 17 14:11:08 2018 all over Wed Jan 17 14:11:08 2018
#註釋:
join()方法的位置是在for循環外的,也就是說必須等待for循環裏的兩個進程都結束後,纔去執行主進程。同步