本文學習自廖雪峰的官方**和菜鳥教程。
程序和執行緒
對於作業系統來說,乙個任務就是乙個程序(process)。
乙個程序可以有多個執行緒(thread)。
多工的實現有3種方式:
多程序模式;
多執行緒模式;
多程序+多執行緒模式。
第三種太複雜,實際很少用。
實際上程序和執行緒實現多工比較複雜,涉及他們之間執行的順序,資料的傳遞等。
直接學multiprocessing吧。
multiprocessing模組提供了乙個process類來代表乙個程序物件,下面的例子演示了啟動乙個子程序並等待其結束:
from multiprocessing import process
import os
# 子程序要執行的**
defrun_proc
(name)
:print
('run child process %s (%s)...'
%(name, os.getpid())
)if __name__==
'__main__'
:print
('parent process %s.'
% os.getpid())
p = process(target=run_proc, args=
('test',)
)print
('child process will start.'
) p.start(
) p.join(
)print
('child process end.'
)
結果:
parent process 5192
.child process will start.
run child process test (
5592).
..child process end.
建立子程序時,只需要傳入乙個執行函式和函式的引數,建立乙個process
例項,用start()
方法啟動。join()
方法可以等待子程序結束後再繼續往下執行,通常用於程序間的同步。
pool
如果要啟動大量的子程序,可以用程序池的方式批量建立子程序:
from multiprocessing import pool
import os, time, random
deflong_time_task
(name)
:print
('run task %s (%s)...'
%(name, os.getpid())
) start = time.time(
) time.sleep(random.random()*
3)end = time.time(
)print
('task %s runs %0.2f seconds.'
%(name,
(end - start)))
if __name__==
'__main__'
:print
('parent process %s.'
% os.getpid())
p = pool(4)
for i in
range(5
):(i,)
)print
('waiting for all subprocesses done...'
) p.close(
) p.join(
)print
('all subprocesses done.'
)
結果:
parent process 228
.waiting for
all subprocesses done...
run task 0
(8868).
..run task 1
(15848).
..run task 2
(11312).
..run task 3
(13488).
..task 3 runs 0.03 seconds.
run task 4
(13488).
..task 4 runs 1.24 seconds.
task 0 runs 1.71 seconds.
task 1 runs 2.31 seconds.
task 2 runs 2.35 seconds.
all subprocesses done.
對pool物件呼叫join()
方法會等待所有子程序執行完畢,呼叫join()
之前必須先呼叫close()
,呼叫close()
之後就不能繼續新增新的process了。
呼叫join()
就是阻塞主程序,等待紫禁城執行完再繼續執行,如果不加close,join這兩句,就會先把主程序執行完,先列印all subprocesses done.然後才會顯示各個子程序的執行時間
以上說的都是程序!!程序!!
下面說的才是執行緒!!執行緒!!
使用threading
模組,啟動乙個執行緒就是把乙個函式傳入並建立thread例項,然後呼叫start()開始執行:
t = threading.thread(target=loop, name=
'loopthread'
)t.start(
)t.join(
)
多執行緒和多程序最大的不同在於,多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響,而多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。
所以使用時需要上鎖,具體的就不學了,估計不得不用的時候才會用。
具體程序還是執行緒,用哪個,我就不複製貼上了,等到以後有了感受再來寫,貼乙個鏈結防止找不到。
執行緒和程序
標準的定義是 程序是執行緒的容器,乙個程序可於乙個或者多個執行緒,它是系統分配資源的基本單位 同乙個程序下,執行緒共享位址空降 已經開啟的檔案 訊號處理函式 報警訊號和其他,執行緒自己只保留程式計數器和棧。但是很遺憾的,這個只是教科書上的定義,實際情況是每個作業系統實現的作業系統特性不同,實現的方法...
程序和執行緒
乙個程序就是當前正在執行的乙個程式,包括程式的暫存器 程式計數器和變數的當前值。不同的程序擁有不同的位址空間。而執行緒可以理解為是程序中的控制流。同乙個程序內也就是說在同乙個位址空間內可以有多個控制流。也就是可以有多個線 程,他們共享位址空間。我們通常將程序視為是資源的集合,程序中有程式的正文 資料...
執行緒和程序
對於求職者,在面試的時候大多都會被問到 你對多執行緒了解麼?給我講講執行緒和程序的區別吧。在unix中,乙個程序可以理解為執行緒 位址空間 檔案描述符 資料,道破現實,其實就相當於老闆和員工,老闆就是程序,員工就是執行緒。老闆需要僱傭若干員工 執行緒 還要有辦公樓 位址空間 還要有若干的辦公裝置 檔...