程序和執行緒

2021-10-25 21:17:42 字數 3170 閱讀 2579

本文學習自廖雪峰的官方**和菜鳥教程。

程序和執行緒

對於作業系統來說,乙個任務就是乙個程序(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中,乙個程序可以理解為執行緒 位址空間 檔案描述符 資料,道破現實,其實就相當於老闆和員工,老闆就是程序,員工就是執行緒。老闆需要僱傭若干員工 執行緒 還要有辦公樓 位址空間 還要有若干的辦公裝置 檔...