程序是程式在計算機上的一次執行活動。當你執行乙個程式,你就啟動了乙個程序。顯然,程式是死的(靜態的),程序是活的(動態的)。程序可以分為系統程序和使用者程序。凡是用於完成作業系統的各種功能的程序就是系統程序,它們就是處於執行狀態下的作業系統本身;所有由你啟動的程序都是使用者程序。程序是作業系統進行資源分配的單位。
開啟乙個程序
import multiprocessing,time,os
def runt
time.sleep(2)
print("開啟乙個程序:%s"%os.getpid())
if __name__ == "__main__":
p = multiprocessing.process(target=runtask,)
p.start()
程序佇列
import multiprocessing
def runtask():
q.put([42,"python"])
if __name__ == "__main__":
q = multiprocessing.queue()
p = multiprocessing.process(target=runtask,)
p.start()
print(q.get()) # 列印結果:[42,"python"]
pipe管道
返回兩個連線物件。代表管道的兩端,預設雙向通訊。
import multiprocessing
def runtask():
conn.send("abc")
conn.close()
if __name__ == "__main__":
conn,pconn = multiprocessing.pipe()
p = multiprocessing.process()
p.start()
print(pconn.recv()) # 列印結果:"abc"
value、array
共享記憶體有兩個結構,乙個是value,乙個是array,這兩個tmffbp結構內部都實現了鎖機制,因此程序是安全的。
import multiprocess
def runtask():
d.value = 50
for index in range(len(a)):
a[index]+=10
if __name__ == "__main__":
# 下面的字元"d"、"i"似乎是固定的,換成其他將會報錯。求大神解釋
d = value("d",20)
a = array("i",range(10))
p = multiprocessing.process(target=runtask,)
p.start()
p.join() # 等待程序執行完畢
print(d.value,a[:]) # 列印結果: 50.0 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
manager
python實現多程序之間通訊除了queue(佇列)、pipe(管道)和value-array之外,還提供了更高層次的封裝。manager支援的型別非常多,如:list, dict, namespace, lock, rlock, semaphore, boundedsemaphore, condition, event, queue, value 和 array 用法如下:
import multiprocessing
def runtask():
d["name"] = "laowang"
l.reverse()
if __name__ == "__main__":
with multiprocessing.manager() as manager:
d = manager.dict()
l = manager.list(range(10))
p = multiprocessing.process(target=runtask,)
p.start()
p.join() # 等待程序執行完畢
print(d,l) # 列印結果: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
程序池pool
pool 是程序池,程序池能夠管理一定的程序,當有空閒程序時,則利用空閒程序完成任務,直到所有任務完成為止
im程式設計客棧port multiprocessing
def runtask():
pass
def callbacktask(arg): # **函式必須要有乙個形參,否則將報錯
print("執行**函式",arg)
if __name__ == "__main__":
pool = multiprocessing.pool(5) # 設定程序池最大同時執行程序數
for index in range(20):
pool.apply_async(func=runtask,callback=callbacktask) # 並行的,有**方法
# pool.apply(func=runtask,) # 序列的,無**函式
pool.close() # 關閉程序池
tmffbppool.join() # #呼叫join之前,先呼叫close函式,否則會出錯。執行完close後不會有新的程序加入到pool,join函式等待所有子程序結束
執行結果:apply方法效果為乙個進行接乙個程式設計客棧程序的執行,而apply_async是同時有5個程序在執行。
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...
Python 多程序與程序池
fork方法是呼叫一次,返回兩次,原因在於作業系統將當前程序 父程序 複製出乙份程序 子程序 這兩個程序幾乎完全相同,於是fork方法分別在父程序和子程序中返回。子程序中永遠返回0,父程序中返回的是子程序的id。importos if name main print current process ...
python多程序 Python多程序實踐
建立程序方式如下 可以通過lock鎖機制實現共享鎖,但比較常用的方式還是以上這些方式,效率更高,更安全。使用方式 構造 類方法 使用方式 構造 更多型別支援一般使用manager,支援的型別包括list,dict,namespace,lock,rlock,semaphore,boundedsemap...