只有本人能看懂的-Python線程,進程,攜程,I/O同步,異步
舉個栗子:
我想get三個url,先用普通的for循環
import requests from multiprocessing import Process from threading import Thread import requests import time # -----正常遍歷 串行 同步----- def get_page(url): page = requests.get(url) print(url) start = time.time() urls = ['http://jandan.net/','https://www.python.org','http://www.gamersky.com/'] for i in urls: get_page(i) end = time.time() print(end - start)
# 這是正常的
這回我用threading模塊給他弄快點。
def get_page(url): page = requests.get(url) start = time.time() list = [] # 線程對象列表 urls = ['http://jandan.net/','http://www.xiaohuar.com/','http://www.gamersky.com/'] for i in urls: ok = Thread(target=get_page,args=(i,)) # target為函數名,args為給函數傳的參數 list.append(ok) # get_page(i) for i in list: i.start() # 啟動一下線程 for i in list: i.join() # 主線程等待子線程執行之后結束 end = time.time() print(end - start)
# 開了仨線程運行
# 如果線程使用了join()函數(主線程代碼將停在join) ,主進程將等待子線程執行結束再執行
# 如果子線程(ok.setDeamon(True))變成守護線程,那么主線程將不會等待子線程執行結束,當主線程結束時,不管子線程是否執行完畢都將強制終止!
我再瞅瞅進程
import multiprocessing import time def run(): i = 0 while i <10000: time.sleep(2) print(i) i+=1 if __name__ == "__main__": p = multiprocessing.Process(target=run) # 一個進程 p.start() print(p.pid) # 查看進程的pid
再來個多進程
import multiprocessing import time def run(): i = 0 while i <10000: time.sleep(2) print(i) i+=1 if __name__ == "__main__": p = multiprocessing.Process(target=run) # 一個進程 p1 = multiprocessing.Process(target=run) # 一個進程 p2 = multiprocessing.Process(target=run) # 一個進程 p.start() p1.start() p2.start() print(p.pid) # 查看進程的pid
