程序
執行緒是最小的執行單元,程序至少有乙個執行緒
如何排程執行緒和程序,完全由作業系統決定,作業系統決定什麼時候執行,執行多長時間
多程序:
multiprocessing模組是跨平台的多程序模組,讓python多程序 能夠跨平台使用,否則windows不支援fork,沒辦法支援多程序了,multiprocessing模組的process類代表乙個程序物件(萬物皆可盤,萬物皆物件)
先說下作業系統:
unix/linux系統提供了乙個fork()系統呼叫,非常特殊,普通函式的呼叫,是呼叫一次返回一次,fork()呼叫是呼叫一次返回兩次,因為作業系統自動將當前程序當作是父程序,同時複製了乙份作為子程序,然後分別在父程序和子程序內返回。父程序返回的是子程序的id,子程序則永遠返回0,為什麼這樣做呢?這樣做的目的是父程序需要fork出很多子程序,要記錄下每個子程序的id,而子程序只需要呼叫getpid()就可以拿到父程序的id
那麼fork()呼叫封裝在**呢?當然是os模組中
有了fork呼叫,當乙個程序接收到新任務的時候就會複製出乙個子程序去處理新任務,apache就是這樣,主程序負責監聽埠,有新的請求時,複製出子程序,然後由子程序負責處理新的http請求;
如果打算編寫多程序的服務,unix或者linux是最佳選擇,windows上不支援fork,但是能否使用多程序呢?
可以,就是前面說到的multiprocessing模組的process類,作為程序物件;
如果想啟動大量的子程序,可以使用程序池,pool,程序池預設的同時執行的程序數是cpu的核數,但是是可以自定義的,
import os
import random
import time
from multiprocessing.pool import pool
def long_time_task(name):
print(name,os.getpid())
start = time.time()
time.sleep(random.random()*3)
end = time.time()
print(name,end-start)
if __name__=="__main__":
print(os.getpid())
p = pool(4)
for i in range(5):
print('hehe')
p.close()
p.join()
print("over")
注意事項:
先呼叫close方法, 之後不會再產生新的子程序
再呼叫join方法,則會等待所有子程序執行完畢
子程序subprocess
import subprocess
# 模擬命令列nslookup www.python.org
r = subprocess.call(['nslookup','www.python.org'])
print(r)
# 如果子程序需要輸入
p = subprocess.popen(['nslookup'],stdin=subprocess.pipe,stdout=subprocess.pipe,stderr=subprocess.pipe)
output,error = p.communicate(b'set q=mx\npython.org\nexit\n')
print(output.decode('utf-8'))
print(p.returncode)
程序間通訊:
process之間肯定是要通訊的,作業系統提供了很多機制實現程序間通訊,multiprocessing封裝了底層機制,提供了queue , pipes等多種方式進行資料交換。
舉例說明queue
在父程序中建立兩個子程序,乙個往queue寫資料,乙個從queue讀資料
分布式程序:
在thread和process中,應當優選process,因為程序更穩定,而且process能分布在多台機器上,而thread最多只能分布在一台機器的多個cpu上,python的multiprocessing模組不但支援多程序,其中managers模組還支援將多程序分布到多台機器上,乙個服務程序可以作為排程者,將任務分配到其他多個程序中,依靠網路進行通訊,由於managers封裝的很好,必須要了解網路通訊的細節,就可以編寫分布式多程序程式。
python 多程序筆記
多程序 import multiprocessing from multiprocessing import process 匯入包 操作和多執行緒一樣 p process target fun,args 1,p.start 多程序佇列queue from multiprocessing impor...
python學習筆記四(python多程序)
寫之前在猶豫,是否需要將多執行緒放在這個之前講或者將多執行緒和多程序合到一起講python的併發性,鑑於內容較多,還是分為兩個吧。這次將介紹multiprocessing模組的用法 怎麼寫多程序程式 程序間通訊 程序間資料共享等。由於python使用了內部的gil,在任意時刻只允許單個執行緒執行,無...
python 程序 python程序
python程序池pool 當需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態生成多個程序,但如果是上百甚至上千個目標,手動的去建立程序的工作量巨大,此時就可以用到multiprocessing模組提供的pool方法。初始化pool是,可以指定乙個最大程序...