對於作業系統來說,乙個任務就是乙個程序(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
模組包裝了底層的機制,提供了queue
、pipes
等多種方式來交換資料。
我們以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
模組。
程序間通訊是通過queue
、pipes
等實現的。
python筆記 程序和執行緒 多執行緒
一 建立乙個多程序 啟動乙個執行緒就是把乙個函式傳入並建立thread例項,然後呼叫start 開始執行 1.1 及執行結果 如以上 所示,threading.current thread 返回程序例項,用threading.current thread name返回例項名稱,主線程例項的名字叫ma...
python學習筆記 執行緒與程序
執行緒 官方 程序 process 是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體 在當代面向執行緒設計的計算機結構中,程序是執行緒的容器。程式是指令 資料及其組織形式的描述,程序是...
Python筆記之程序和執行緒
對於作業系統來說,乙個任務就是乙個程序 process 比如開啟乙個瀏覽器就是乙個程序,開啟兩個記事本就是兩個程序 那麼什麼是執行緒呢?我們發現,有些程序不止能做一件事,比如乙個word程序可以同時進行打字,拼寫檢查,列印等事情,也就是乙個程序可能要同時執行多個 子任務 程序內的這些子任務就稱為執行...