python學習筆記 程序和執行緒

2021-07-24 12:50:57 字數 3812 閱讀 6442

對於作業系統來說,乙個任務就是乙個程序(process),比如開啟乙個瀏覽器就是啟動乙個瀏覽器程序,開啟乙個記事本就啟動了乙個記事本程序,開啟兩個記事本就啟動了兩個記事本程序,開啟乙個word就啟動了乙個word程序。

有些程序還不止同時幹一件事,比如word,它可以同時進行打字、拼寫檢查、列印等事情。在乙個程序內部,要同時幹多件事,就需要同時執行多個「子任務」,我們把程序內的這些「子任務」稱為執行緒(thread)。

由於每個程序至少要幹一件事,所以,乙個程序至少有乙個執行緒。當然,像word這種複雜的程序可以有多個執行緒,多個執行緒可以同時執行,多執行緒的執行方式和多程序是一樣的,也是由作業系統在多個執行緒之間快速切換,讓每個執行緒都短暫地交替執行,看起來就像同時執行一樣。當然,真正地同時執行多執行緒需要多核cpu才可能實現。

多程序閱讀: 93547

要讓python程式實現多程序(multiprocessing),我們先了解作業系統的相關知識。

unix/linux作業系統提供了乙個fork()系統呼叫,它非常特殊。普通的函式呼叫,呼叫一次,返回一次,但是fork()呼叫一次,返回兩次,因為作業系統自動把當前程序(稱為父程序)複製了乙份(稱為子程序),然後,分別在父程序和子程序內返回。

子程序永遠返回0,而父程序返回子程序的id。這樣做的理由是,乙個父程序可以fork出很多子程序,所以,父程序要記下每個子程序的id,而子程序只需要呼叫getppid()就可以拿到父程序的id。

python的os模組封裝了常見的系統呼叫,其中就包括fork,可以在python程式中輕鬆建立子程序:

# multiprocessing.py

import os

print

'process (%s) start...' % os.getpid()

pid = os.fork()

if pid==0:

print

'i am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())

else:

print

'i (%s) just created a child process (%s).' % (os.getpid(), pid)

執行結果如下:

process (876) start...

i (876) just created a child process (877).

i am child process (877) and my parent is

876.

如果你打算編寫多程序的服務程式,unix/linux無疑是正確的選擇。由於windows沒有fork呼叫,難道在windows上無法用python編寫多程序的程式?

由於python是跨平台的,自然也應該提供乙個跨平台的多程序支援。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

'process will start.'

p.start()

p.join()

print

'process end.'

執行結果如下:

parent process 928.

process will start.

run child process test (929)...

process end.

建立子程序時,只需要傳入乙個執行函式和函式的引數,建立乙個process例項,用start()方法啟動,這樣建立程序比fork()還要簡單。

join()方法可以等待子程序結束後再繼續往下執行,通常用於程序間的同步。

process之間肯定是需要通訊的,作業系統提供了很多機制來實現程序間的通訊。python的multiprocessing模組包裝了底層的機制,提供了queuepipes等多種方式來交換資料。

我們以queue為例,在父程序中建立兩個子程序,乙個往queue裡寫資料,乙個從queue裡讀資料:

from multiprocessing import process, queue

import os, time, random

# 寫資料程序執行的**:

defwrite

(q):

for value in ['a', 'b', 'c']:

print

'put %s to queue...' % value

q.put(value)

time.sleep(random.random())

# 讀資料程序執行的**:

defread

(q):

while

true:

value = q.get(true)

print

'get %s from queue.' % value

if __name__=='__main__':

# 父程序建立queue,並傳給各個子程序:

q = queue()

pw = process(target=write, args=(q,))

pr = process(target=read, args=(q,))

# 啟動子程序pw,寫入:

pw.start()

# 啟動子程序pr,讀取:

pr.start()

# 等待pw結束:

pw.join()

# pr程序裡是死迴圈,無法等待其結束,只能強行終止:

pr.terminate()

執行結果如下:

put a to queue...

get a from queue.

put b to queue...

get b from queue.

put c to queue...

get c from queue.

在unix/linux下,可以使用fork()呼叫實現多程序。

要實現跨平台的多程序,可以使用multiprocessing模組。

程序間通訊是通過queuepipes等實現的。

python筆記 程序和執行緒 多執行緒

一 建立乙個多程序 啟動乙個執行緒就是把乙個函式傳入並建立thread例項,然後呼叫start 開始執行 1.1 及執行結果 如以上 所示,threading.current thread 返回程序例項,用threading.current thread name返回例項名稱,主線程例項的名字叫ma...

python學習筆記 執行緒與程序

執行緒 官方 程序 process 是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體 在當代面向執行緒設計的計算機結構中,程序是執行緒的容器。程式是指令 資料及其組織形式的描述,程序是...

Python筆記之程序和執行緒

對於作業系統來說,乙個任務就是乙個程序 process 比如開啟乙個瀏覽器就是乙個程序,開啟兩個記事本就是兩個程序 那麼什麼是執行緒呢?我們發現,有些程序不止能做一件事,比如乙個word程序可以同時進行打字,拼寫檢查,列印等事情,也就是乙個程序可能要同時執行多個 子任務 程序內的這些子任務就稱為執行...