python 多程序 協程 實現併發

2022-09-14 10:21:11 字數 1879 閱讀 4596

使用程序池創(pool)建程序,用佇列(queue)進行程序間通訊。在子程序裡邊用協程去處理。

直接上**:

from datetime import

datetime

from multiprocessing import

pool, manager

import

asyncio

from random import

randint

import

math

import

os'''

需求: 有乙個列表,列表中的元素求二次冪,並將值返回

方案:用3個子程序,並在每個子程序中用協程去處理

'''async

defpower(num): #

冪運算 用延時來模擬阻塞

#print(f'pid: ')

await asyncio.sleep(randint(1, 5))

return num*num

defcreate_task(data:list, queue): #

print(f'pid: ')

#建立event_loop

loop =asyncio.new_event_loop() #

建立task 將每乙個元素建立乙個task去執行

tasks = [loop.create_task(power(el)) for el in

data] #

執行loop.run_until_complete(asyncio.wait(tasks)) #

獲取task結果

for task in

tasks:

#將結果寫到佇列中

#print(f'---: ')

queue.put(task.result())

defhandle(data: list):

process_num = 3

#初始化程序池

pool = pool(processes=process_num) #

建立佇列 使用程序池的時候,建立佇列用manager才能使用

queue =manager().queue()

start =0

num = math.ceil(len(data) / process_num) #

資料長度 / 子程序數量 向上取整,將資料分成份,分給給每個程序

for i in range(1, num + 1):

end = i*num

#建立子程序,並傳入資料和佇列

start =end

#等所有程序執行完之後關閉程序

pool.close()

pool.join() #

獲取執行結果

res =list()

while

notqueue.empty():

#從佇列中獲取資料

return

resif

__name__ == '

__main__':

bg =datetime.now()

data = list(range(10))

res =handle(data)

print('

res'

, res)

print('

spend time:

', datetime.now()-bg)

在django中使用多程序時,如果出現

解決方案:

在使用到多程序的檔案的最上邊新增以下**:

importdjango

django.setup()

python 多程序 04 協程

協程是程式設計師創造出來的 單純的協程沒有作用 需要io操作時候進行切換 才有意義 原理 greenlet import greenlet def f1 print 11 gr2.switch print 33 gr2.switch def f2 print 22 gr1.switch print ...

多執行緒 多程序 協程

占用的資源 程序 執行緒 協程 程序的顆粒度太大,每次都要有上下的調入,儲存,調出。執行緒 乙個軟體的執行不可能是一條邏輯執行的,必定有多個分支和多個程式段,就好比要實現程式a,實際分成 a,b,c等多個塊組合而成 這裡的a,b,c就是執行緒,也就是說執行緒是共享了程序的上下文環境,的更為細小的cp...

多執行緒 多程序 協程

程序 個執行的程式 就是乙個程序,沒有執行的 叫程式,程序是系統資源分配的最 小單位,程序擁有自己獨立的記憶體空間,所以程序間資料不共享,開銷大。執行緒 排程執行的最小單位 也叫執行路徑,不能獨立存在,依賴程序存在乙個程序至少有一 個 執行緒,叫主線程,而多個執行緒共享記憶體 資料共享,共享全域性變...