Python 的 程序/執行緒
阿新 • • 發佈:2018-12-15
-
程序是作業系統分配記憶體的基本單元,程序之間的記憶體是相互隔離的,通過icp機制/管道通訊。 一個程序可以劃分為多個執行緒,執行緒是程序的執行單元 ,也是作業系統分配cpu的執行單元;執行緒啟用的越多,佔用cpu越多。
使用多執行緒/多程序可以提升執行效率,縮短程式執行時間;改善使用者體驗。
-
python中使用多程序比多執行緒更好,因為多程序相互之間是獨立的,程式執行效率更高。
程序
from multiprocessing import Process import subprocess # subprocess子程序 import time import os def output(): print(os.getpid()) # 啟用多程序 while True: print('Pong', end = '', flush=True) # flush=True關閉快取 time.sleep(0.001) def main(): print(os.getpid) # 列印程序號 p = Process(target=output) # 這裡傳入函式名,表示程序啟用後才在這個程序裡面去執行函式 p.start() while True: print('Ping', end = '', flush=True) time.sleep(0.001) def main(): subprocess.call('calc') # call呼叫calc計算器 subprocess.call('notepad') if __name__ == '__main__': main()
執行緒
- 多執行緒是共享記憶體的,共享資料。 python不能用到cpu的多核特性,但是這不代表他的多程序、多執行緒是無用的。 實際開發中,多執行緒的程式不好寫,也不好除錯,因為cpu分配是隨機的,執行時如果有bug那麼就不知道它什麼時候回出現問題。
- 建立執行緒的兩種方式: 1,直接建立Thread物件並通過target引數指定執行緒啟動後要執行的任務。 2,繼承Thread自定義執行緒,通過重寫run方法指定執行緒啟動後執行的任務,推薦使用這種方法!
from threading import Thread # from thread是python2中使用的模組 from time import sleep def output(): while True: print('Pong', end='', flush=True) sleep(0.001) def main(): t1 = Thread(target=output) t1.start() while True: print('Ping', end='', flush=True) sleep(0.001) if __name__ == '__main__': main()
from time import sleep def output(string): while True: print(string, end='', flush=True) sleep(0.001) def main(): # 這裡應該使用元組,並且儘管只有一個元素,但是也要加上逗號,否則就是一個字串 t1 = Thread(target=output, args=('Ping',)) t1.start() t2 = Thread(target=output, args=('Pong',)) t2.start() if __name__ == '__main__': main()
from threading import Thread
from time import sleep
def output(string):
while True:
print(string, end='', flush=True)
sleep(0.001)
def main():
# daemon=True - 將執行緒設定為守護執行緒(不值得保留的執行緒),其他執行緒/主程式如果執行完了,那麼守護執行緒自動結束
t1 = Thread(target=output, args=('Ping',),daemon=True)
t1.start()
t2 = Thread(target=output, args=('Pong',), daemon=True)
t2.start()
if __name__ == '__main__':
main()
多程序模擬下載檔案 如果多個任務之間沒有任何的關聯(獨立子任務),而且希望利用cpu的多核特性,那麼我們推薦使用多程序,因為任務之間沒有資料交換
import time
import random
from threading import Thread
def download(filename):
print('開始下載%s...' % filename)
delay = random.randint(5,15)
time.sleep(delay)
print('%s下載完成,用時%d秒' % (filename, delay))
# 如果要寫多執行緒,推薦使用這種方法
class DownloadTask(Thread):
def __init__(self, filename):
super().__init__()
self._filename = filename
# 鉤子函式(hook) / 回撥函式(callback)(寫了這個方法,但是從來沒有呼叫它,它是讓系統啟動執行緒的時候自動回撥這個方法)
# 寫程式時啟用執行緒用start,不能用run!!!
def run(self):
download(self._filename)
def main():
start = time.time()
t1 = DownloadTask('Python從入門到住院.pdf')
t1.start()
t2 = DownloadTask('Pekin Hot.avi')
t2.start()
t1.join() # join等待程序結束(然後再列印時間)
t2.join()
end = time.time()
print('總共耗費了%f秒' % (end - start))
if __name__ == '__main__':
main()