今天一大早起床, 又學三個臭函式, 記錄一下自己渺小微弱的學習之路
有時候join()我們是用來連線字串的, 但就在今天我學習程序的時候, 看見join()
, 居然不是用來連線字串了, 而是用來阻塞程序, 興趣大增, 便深入了解了一下,
join()的作用:在程序中可以阻塞主程序的執行, 直到等待子執行緒全部完成之後, 才繼續執行主線程後面的**
我們先來看下面的**, 這段**沒有使用join()
**段a
import threading
import time
def test(num):
time.sleep(1)
print(num)
#定義乙個用來裝子執行緒的列表
threads =
for i in range(5):
#target 指定子執行緒要執行的funtion, args 指定該funtion需要傳入的引數
thread = threading.thread(target = test, args = [i])
#上面的 thread 是乙個個引數i都不同的執行緒, 現在把它乙個個裝進列表 threads 裡面
for i in tsreads:
#for 迴圈執行 threads 列表裡面的全部執行緒, 沒有用 join()執行緒是無序執行的,
# 就連最後一句print('end')可能比所有子執行緒都要先執行
i.start()
print('end')
執行結果,可以看出主線程先執行完, 完全沒有等待子執行緒全部執行完之後再執行,而且子執行緒都是無序執行完畢的
我們再來看下面的**, 這段**段a的基礎上在i.start()
的後面多新增一條i.join()
for i in tsreads:
i.start()
i.join()
執行結果,可以看到主線程最後一句print('end')
等待到了所有子執行緒都完成之後在執行了, 因為i.join()
的出現阻塞了主線程的執行, 等待所有子執行緒執行完畢再執行. 而且所有的子執行緒都是乙個接乙個地執行, 等待到本子執行緒執行完畢之後, 在執行下乙個
我們再來看下面的**, 這段**段a的基礎上在for i in rangs(5):
的後面多新增一條for i in threads:
for i in tsreads:
i.start()
for i in threads:
i.join()
執行結果在這裡看一看出來, join()還是阻擋了主線程的執行, 讓所有的子執行緒執行完畢之後再執行, 而且前面的子執行緒的執行都是無序地執行完畢了
大家可以改一下程式的**, 利用start_time = time.time()
來觀察一下加或不加join() 之後的執行效率, 在我執行的時候, 上面第二種**會執行效率比較低, 耗時5秒, 因為每執行乙個子執行緒會time.sleep(1)秒鐘, 在第一和第三種情況沒有 join()的阻塞, **會更快執行完, 大概也就1或2秒吧. 這就有關非同步之類的問題了, 我會在之後接著學習.
知識要一點一點積累,
咦??我打下這9個字的時候想哭是怎麼回事???
python多程序之程序池
在利用python進行系統管理的時候,特別是同時操作多個檔案目錄,或者遠端控制多台主機,並行操作可以節約大量的時間。當被操作物件數目不大時,可以直接利用multiprocessing中的process動態成生多個程序,十幾個還好,但如果是上百個,上千個目標,手動的去限制程序數量卻又太過繁瑣,此時可以...
python多程序之multiprocessing
簡單的理解 單板上執行的乙個程式就是乙個程序。程序是作業系統分配資源的最小單位,不同的程序之間資源不共享,程序間通訊需要使用特定的方式。python提供了自帶的multiprocessing庫,用於多執行緒場景。import multiprocessing import time defworker...
Python多程序之Queue管道
from multiprocessing import process,queue 匯入程序的佇列模組,跟執行緒裡的是不一樣 deff q q.put 42,none,hello q.put test if name main 生成乙個佇列,然後將佇列傳給子程序,然後父程序就可以訪問這個子程序操作後...