1. 程式人生 > >多線程 threading

多線程 threading

情況下 app 多進程 情況 over 來看 退出 兩個 sta

多進程和多線程都可以執行多個任務,線程是進程的一部分。線程的特點是線程之間可以共享內存和變量,資源消耗少(不過在Unix環境中,多進程和多線程資源調度消耗差距不明顯,Unix調度較快),缺點是線程之間的同步和加鎖比較麻煩。

在Python中,同樣可以實現多線程,有兩個標準模塊thread和threading,不過我們主要使用更高級的threading模塊。
一、先來看一段代碼

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()

結果:

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結果:

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秒結果如下:

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循環裏的兩個進程都結束後,才去執行主進程。

多線程 threading