python 管道, 事件, 訊號量, 程序池

2022-08-01 02:00:21 字數 3362 閱讀 9681

from multiprocessing import process, pipe

def f1(conn):

# 管道的recv 裡面不用寫數字

from_main_process = conn.recv()

print('我是子程式')

print(from_main_process)

if __name__ == '__main__':

# 建立乙個管道,返回管道的兩端conn1 和 conn2 但是只能在一邊發訊息,另一端接訊息,自己這一段是不能接的

conn1, conn2 = pipe()

p1 = process(target=f1,args=(conn2,))

p1.start()

# 管道的傳送裡面也不用發位元組

conn1.send('oh baby')

print('我是爸爸')

# 資料接收一次就沒有了.也就是說,往管道裡面傳一次訊息,即使有多個程序都來接收,但是只能有乙個接收成功

import time

from multiprocessing import process,event

def f1(e):

time.sleep(2)

n = 100

print('子程序計算結果為',n)

# 將初識物件改為true

e.set()

# 檢視現在的狀態

print('現在的狀態是->',e.is_set())

if __name__ == '__main__':

# 建立事件物件,初識狀態是false

e = event()

p = process(target=f1,args=(e,))

p.start()

print('主程序等待...')

# e.clear() # clear 是將狀態改為false

# 這個物件的狀態為false的時候,就在wait的地方等待

e.wait()

print('結果已經寫入檔案了,可以拿到這值')

import time

import random

from multiprocessing import process,semaphore

def f1(i, s):

s.acquire() # 加鎖

print('男嘉賓%s號到了' % i)

time.sleep(random.randint(1,3))

s.release() # 解鎖 每有乙個解開就會有乙個進去

if __name__ == '__main__':

s = semaphore(3) # 計數器 一起能去3個程序

for i in range(10):

p = process(target=f1,args=(i, s))

p.start()

程序的建立和銷毀是很浪費時間的,影響**執行效率. 所以說程序池比多程序同時執行的時候會省很多時間,因為程序池沒有建立和銷毀這一過程.

import time

from multiprocessing import process,pool

def f1(n):

pass

if __name__ == '__main__':

#統計程序池執行100個任務的時間

s_time = time.time()

# 裡面這個引數是指定程序池中有多少個程序用的,4表示4個程序,如果不傳引數,預設開啟的程序數一般是cpu的個數

pool = pool(4)

pool.map(f1,range(100)) #引數資料必須是可迭代的,非同步提交任務,自帶close和join功能

e_time = time.time()

dif_time = e_time - s_time

#統計100個程序,來執行100個任務的執行時間

p_s_t = time.time() #多程序起始時間

p_list =

for i in range(100):

p = process(target=f1,args=(i,))

p.start()

# 要加入列表裡面之後把所有的都加上join

[pp.join() for pp in p_list]

p_e_t = time.time()

p_dif_t = p_e_t - p_s_t

同步方法

import time

from multiprocessing import process,pool

def f1(n):

time.sleep(1)

return n*n

if __name__ == '__main__':

pool = pool(4)

for i in range(10):

# 程序池的同步方法,將任務變成了序列

print(res)

非同步方法

import time

from multiprocessing import process,pool

def f1(n):

time.sleep(2)

return n*n

if __name__ == '__main__':

pool = pool()

res_list =

for i in range(5):

#非同步給程序池提交任務

print('等待所有任務執行完')

# pool.close() #鎖住程序池,意思就是不讓其他的程式再往這個程序池裡面提交任務了,工作中一般不會鎖

# pool.join()

#列印結果,如果非同步提交之後的結果物件

for i in res_list:

# get()方法就是有就拿,沒有就等著

print(i.get()) # 拿到的是返回結果 0,1,4,9,16

from multiprocessing import pool,process

def f1(n):

print('>>>>',n)

return n*n

def call_back_func(n):

print('**函式中的結果:',n)

if __name__ == '__main__':

pool = pool(4)

# callback就是把f1 的返回值當引數傳入函式

pool.close()

pool.join()

併發 32 管道 事件 訊號量 程序池

像佇列一樣,資料只能取走一次 conn1,conn2 pipe 建立管道 send 傳送 recv 接收 二.事件 等待 event類 名 event 建立乙個事件 預設狀態為false 名.set 改變值為true 名.clear 改變值為false 名.is set 檢視事件的狀態 名.wait...

python 程序訊號量

1 概念 訊號量和鎖相似,鎖同一時間只允許乙個物件 程序 通過,訊號量同一時間允許多個物件 程序 通過 2 應用場景 多執行緒,並規定數量 3 格式 匯入訊號量模組 例項化訊號量物件,可以規定訊號量的個數 傳遞物件 拿到一把鑰匙 釋放一把鑰匙 4 過程 獲得鑰匙,當鑰匙串沒鑰匙時,其它程序要在外面等...

訊號量 事件 鎖 守護程序

什麼是程序?程序是計算機中最小的資源分配單位 程序與程序之間資料隔離,執行過程非同步 為什麼會出現程序的概念?合理利用cpu 提高使用者體驗 多個程序是可以同時利用多個cpu的,可以實現並行的效果 在主程序中控制子程序的方法?子程序物件 process target,args 在建立的這一刻根本就沒...