python的標準庫提供了兩個模組:thread和threading,thread是低階模組,threading是高階模組,對thread進行了封裝。絕大多數情況下,我們只需要使用threading這個高階模組。
啟動乙個執行緒就是把乙個函式傳入並建立thread例項,然後呼叫start()開始執行:
import time,threading
defloop
():print
'thread %s is running...'%threading.current_thread().name
n = 0
while n<5:
n= n+1
print
'thread %s >>> %s'%(threading.current_thread().name,n)
time.sleep(1)
print
'thread %s end.' %threading.current_thread().name
print
'thread %s in running...' % threading.current_thread().name
t = threading.thread(target = loop,name = 'loopthread')
t.start()
t.join()
print
'thread %s end.' %threading.current_thread().name
輸出結果:
thread mainthread is running…由於任何程序預設就會啟動乙個執行緒,我們把該執行緒稱為主線程,主線程又可以啟動新的執行緒,python的threading模組有個current_thread()函式,它永遠返回當前執行緒的例項。主線程例項的名字叫mainthread,子執行緒的名字在建立時指定,我們用loopthread命名子執行緒。名字僅僅在列印時用來顯示,完全沒有其他意義,如果不起名字python就自動給執行緒命名為thread-1,thread-2……thread loopthread is running…
thread loopthread >>> 1
thread loopthread >>> 2
thread loopthread >>> 3
thread loopthread >>> 4
thread loopthread >>> 5
thread loopthread ended.
thread mainthread ended.
import threading
# 3.lock
# 假定這是你的銀行存款:
balance = 0
lock = threading.lock()
defchange_it
(n):
# 先存後取,結果應該為0:
global balance
balance = balance + n
balance = balance - n
defrun_thread
(n):
for i in range(100000):
lock.acquire()
try:
change_it(n)
finally:
lock.release()
t1 = threading.thread(target=run_thread, args=(5,))
t2 = threading.thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print balance
from random import randint
from time import sleep
from queue import queue
from mythread import mythread
defwriteq
(queue):
print
'producing object for q...',
queue.put('***', 1)
print
"size now", queue.qsize()
defreadq
(queue):
val = queue.get(1)
print
'consumed object from q... size now', \
queue.qsize()
defwriter
(queue, loops):
for i in range(loops):
writeq(queue)
sleep(randint(1, 3))
defreader
(queue, loops):
for i in range(loops):
readq(queue)
sleep(randint(2, 5))
funcs = [writer, reader]
nfuncs = range(len(funcs))
defmain
(): nloops = randint(2, 5)
q = queue(32)
threads =
for i in nfuncs:
t = mythread(funcs[i], (q, nloops), \
funcs[i].__name__)
for i in nfuncs:
threads[i].start()
for i in nfuncs:
threads[i].join()
print
'all done'
if __name__ == '__main__':
main()
starting writer at: mon mar 06 16:34:51 2017參考文獻:add for q… size now= 1
starting reader at: mon mar 06 16:34:51 2017
sub from q… size now= 0
add for q… size now= 1
sub from q… size now= 0
add for q… size now= 1
add for q… size now= 2
writer finished at: mon mar 06 16:34:57 2017
sub from q… size now= 1
sub from q… size now= 0
reader finished at: mon mar 06 16:35:06 2017
all done
python多執行緒 python多執行緒
通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...
python多執行緒詳解 Python多執行緒詳解
前言 由於最近的工作中一直需要用到python去處理資料,而在面對大量的資料時,python多執行緒的優勢就展現出來了。因而藉此機會,盡可能詳盡地來闡述python多執行緒。但對於其更底層的實現機制,在此不做深究,僅是對於之前的一知半解做個補充,也希望初學者能夠通過這篇文章,即便是照葫蘆畫瓢,也能夠...
python程式多執行緒 PYTHON多執行緒
在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...