from multiprocessing import process, pipedef 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 timefrom 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 timefrom 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,processdef 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 在建立的這一刻根本就沒...