Python多程序原理與用法分析

2022-10-04 19:03:13 字數 2780 閱讀 4715

程序是程式在計算機上的一次執行活動。當你執行乙個程式,你就啟動了乙個程序。顯然,程式是死的(靜態的),程序是活的(動態的)。程序可以分為系統程序和使用者程序。凡是用於完成作業系統的各種功能的程序就是系統程序,它們就是處於執行狀態下的作業系統本身;所有由你啟動的程序都是使用者程序。程序是作業系統進行資源分配的單位。

開啟乙個程序

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...