python 的程序 執行緒以及協程 1

2021-08-09 20:08:44 字數 3508 閱讀 7029

通過實現process類來建立:process(group=none,target=none,name=none,args=(),kwargs={})
引數說明:target:表示這個程序例項所呼叫物件;

args:表示呼叫物件的位置引數元組;

kwargs:表示呼叫物件的關鍵字引數字典;

name:為當前程序例項的別名;

group:大多數情況下用不到;

process類常用方法:

is_alive():判斷程序例項是否還在執行;

join([timeout]):是否等待程序例項執行結束,或等待多少秒;

start():啟動程序例項(建立子程序);

run():如果沒有給定target引數,對這個物件呼叫start()方法時,就將執行物件中的run()方法;

terminate():不管任務是否完成,立即終止;

from multiprocessing import process

import os

defrun

(name,height=0,weight=0):

print("process %s:%s,height:%s,weight:%s"% (name, os.getpid(), height, weight))

if__name__ == '__main__':

for i in range(8):

p = process(target=run, args=(str(i),), kwargs=)

print('process will start')

p.start()

p.join()# 實現程序的同步,等待最後子程序結束,如果不加的這個語句可能會出現主程序結束而子程序沒有結束,因為主程序結束導致未完成的主程序結束

print('process end')

multiprcessing 提供了 pool類來代表程序池物件,pool 可以提供指定的程序提供使用者呼叫,預設是cpu的核數。但有新的請求提交到pool時 如果池沒有滿,就建立,如果滿了,就會等待,直到有程序結束,才會建立新的程序來處理.

pool(processes=none,initializer=none,initargs(),maxtasksperchild=none,context=none)

引數說明:

processes:程序池最大個數,如果是none,通過返回的數字os.cpu_count()被使用(預設是cpu的核數)

initializer:如果不是none,那麼將在將啟動每個工作程序時呼叫initializer( initargs)。*

maxtasksperchild:乙個工作程序在它退出之前完成的任務的數量,被乙個新的工作 程序所取代,從而使未使用的資源得到釋放,預設的maxtasksperchild是none,這意味著工作程序將與池一樣長

(允許在池內的工作程序在退出前只完成一定數量的工作,然後進行清理,並生成新的程序來替換舊的工作)

context:可以用來指定啟動工作程序所用的上下文。通常,池是使用函式multiprocess. pool()或上下文物件的pool()方法建立的。在這兩種情況下都適當地設定了上下文。

常用方法:

map(func,iterable[,chunksize]):

乙個類似於map()內建函式的等價函式(它只支援乙個可迭代的引數)。它會使程序阻塞與此直到結果返回 ,返回列表,該方法將迭代分成若干塊,並將其提交到程序池作為單獨的任務。這些塊的(大約)大小可以通過將chunksize設定為乙個正整數來指定。

map_async(func, iterable[, chunksize[, callback]])

與map用法一致,但是它是非阻塞的。可以同過返回結果.get()得到程序池返回結果列表

close()

關閉程序池(pool),使其不在接受新的任務。

terminate()

結束工作程序,不在處理未處理的任務。

join()

主程序阻塞等待子程序的退出,join方法必須在close或terminate之後使用。

from multiprocessing import pool

import os,time,random

defrun

(name):

print('prcess%s(%s)'% (name,os.getpid()))

time.sleep(random.random()*3)

print('end %s'% name)

return name

defrun1

(): print(1);

if __name__ == '__main__':

args = (10, 20, 30)

list = [1,2,3,4,5,6,7,8,9,10,11]

p = pool(processes=4,initializer=run1,)

result = p.map_async(run,list)

p.close()

p.join()

print('-'*80)

結果

上面的兩個結果可以看出每個程序啟動前會呼叫initializer函式,當我設定maxtasksperchild=2的時候可以看出每個程序完成2次任務會被新的程序替代

Python 程序 執行緒 協程

程序和執行緒之間的關係 執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊 如程式計數...

Python 程序,執行緒, 協程

程序是系統進行資源分配和排程的乙個獨立單位 最小單位 程序的幾個狀態 空 新建 建立執行乙個程式的新程序,可能的事件有 新的批處理作業 互動登入 終端使用者登入到系統 作業系統因為提供一項服務而建立 由現有的程序派生等。新建 就緒 作業系統準備好再接納乙個程序時,把乙個程序從新建態轉換為就緒態。就緒...

執行緒程序以及協程的區別

程序,儲存在硬碟上的程式執行之後,會在記憶體裡形成乙個獨立的記憶體體,這個記憶體體有自己獨立的位址空間,有自己的堆,上級掛靠單位是作業系統,作業系統會以程序為單位分配系統資源 cpu時間片,記憶體等資源 程序是資源分配的最小單位。執行緒也成為輕量級執行緒,是作業系統排程 cpu排程 執行的最小單位 ...