python提供了幾個用於多執行緒程式設計的模組,包括thread、threading和queue等。thread和threading模組允許程式設計師建立和管理執行緒。thread模組提供了基本的執行緒和鎖的支援,threading提供了更高階別、功能更強的執行緒管理的功能。queue模組允許使用者建立乙個可以用於多個執行緒之間共享資料的佇列資料結構。
避免使用thread模組,因為更高階別的threading模組更為先進,對執行緒的支援更為完善,而且使用thread模組裡的屬性有可能會與threading出現衝突;其次低階別的thread模組的同步原語很少(實際上只有乙個),而threading模組則有很多;再者,thread模組中當主線程結束時,所有的執行緒都會被強制結束掉,沒有警告也不會有正常的清除工作,至少threading模組能確保重要的子執行緒退出後程序才退出。
thread模組不支援守護執行緒,當主線程退出時,所有的子執行緒不論它們是否還在工作,都會被強行退出。而threading模組支援守護執行緒,守護執行緒一般是乙個等待客戶請求的伺服器,如果沒有客戶提出請求它就在那等著,如果設定乙個執行緒為守護執行緒,就表示這個執行緒是不重要的,在程序退出的時候,不用等待這個執行緒退出。
multiprocess模組的完全模仿了threading模組的介面,二者在使用層面,有很大的相似性,因而不再詳細介紹(官方鏈結)
from threading import thread
import time
def sayhi(name):
time.sleep(2)
print('%s say hello' %name)
if __name__ == '__main__':
t=thread(target=sayhi,args=('nick',))
t.start()
print('主線程')
from threading import thread
import time
class sayhi(thread):
def __init__(self,name):
super().__init__()
self.name=name
def run(self):
time.sleep(2)
print('%s say hello' % self.name)
if __name__ == '__main__':
t = sayhi('nick')
t.start()
print('主線程')
from threading import thread
from multiprocessing import process
import os
def work():
print('hello',os.getpid())
if __name__ == '__main__':
# part1:在主程序下開啟多個執行緒,每個執行緒都跟主程序的pid一樣
t1=thread(target=work)
t2=thread(target=work)
t1.start()
t2.start()
print('主線程/主程序pid',os.getpid())
# part2:開多個程序,每個程序都有不同的pid
p1=process(target=work)
p2=process(target=work)
p1.start()
p2.start()
print('主線程/主程序pid',os.getpid())
from threading import thread
from multiprocessing import process
import os
def work():
print('hello')
if __name__ == '__main__':
# 在主程序下開啟執行緒
t=thread(target=work)
t.start()
print('主線程/主程序')
'''列印結果:
hello
主線程/主程序
'''# 在主程序下開啟子程序
t=process(target=work)
t.start()
print('主線程/主程序')
'''列印結果:
主線程/主程序
hello
'''
from threading import thread
from multiprocessing import process
import os
def work():
global n
n=0if __name__ == '__main__':
# n=100
# p=process(target=work)
# p.start()
# p.join()
# print('主',n)
# 毫無疑問子程序p已經將自己的全域性的n改成了0,
# 但改的僅僅是它自己的,檢視父程序的n仍然為100
n=1t=thread(target=work)
t.start()
t.join()
print('主',n) # 檢視結果為0,因為同一程序內的執行緒之間共享程序內的資料
thread例項物件的方法:
threading模組提供的一些方法:
from threading import thread
import threading
from multiprocessing import process
import os
def work():
import time
time.sleep(3)
print(threading.current_thread().getname())
if __name__ == '__main__':
# 在主程序下開啟執行緒
t=thread(target=work)
t.start()
print(threading.current_thread().getname())
print(threading.current_thread()) # 主線程
print(threading.enumerate()) # 連同主線程在內有兩個執行的執行緒
print(threading.active_count())
print('主線程/主程序')
'''列印結果:
mainthread
<_mainthread(mainthread, started 140735268892672)>
[<_mainthread(mainthread, started 140735268892672)>, ]
主線程/主程序
thread-1
'''
from threading import thread
import time
def sayhi(name):
time.sleep(2)
print('%s say hello' %name)
if __name__ == '__main__':
t=thread(target=sayhi,args=('nick',))
t.start()
t.join()
print('主線程')
print(t.is_alive())
'''nick say hello
主線程false
'''
import multiprocessing
import threading
import socket
s=socket.socket(socket.af_inet,socket.sock_stream)
s.bind(('127.0.0.1',8080))
s.listen(5)
def action(conn):
while true:
data=conn.recv(1024)
print(data)
conn.send(data.upper())
if __name__ == '__main__':
while true:
conn,addr=s.accept()
p=threading.thread(target=action,args=(conn,))
p.start()
import socket
s=socket.socket(socket.af_inet,socket.sock_stream)
s.connect(('127.0.0.1',8080))
while true:
msg=input('>>: ').strip()
if not msg:continue
s.send(msg.encode('utf-8'))
data=s.recv(1024)
print(data)
Python程式中的執行緒操作 守護執行緒
無論是程序還是執行緒,都遵循 守護xx會等待主xx執行完畢後銷毀。需要強調的是 執行完畢並非終止執行。對主程序來說,執行完畢指的是主程序 執行完畢 對主線程來說,執行完畢指的是主線程所在的程序內所有非守護執行緒統統執行完畢,主線程才算執行完畢。1.1詳細解釋 主程序在其 結束後就已經算執行完畢了 守...
python執行緒喚醒 Python中的執行緒
執行緒同步 概念執行緒同步,執行緒間協同,通過某種技術,讓乙個執行緒訪問某些資料時,其他執行緒不能訪問這些資料,直到該執行緒完成對資料的操作.臨界區 critical section 互斥量 mutex 訊號量 semaphore 時間 event event事件 event事件,是執行緒間通訊機制...
python程式多執行緒 PYTHON多執行緒
在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...