Python學習筆記|Python之程式
1.單程式
def work_1(f,n):
print('work_1 start')
for i in range(n):
with open(f,'a') as fs:
fs.write('i love pyhton \n')
time.sleep(1)
print('work_1 end')
def work_2(f,n):
print('work_2 start')
for i in range(n):
with open(f,'a') as fs:
fs.write('i love java \n')
time.sleep(1)
print('work_2 end')
if __name__ == '__main__':
work_1('file.txt',3)
work_2('file.txt',3)
2.多程式
- 建立程式
匯入import multiprocessing,使用Process方法建立程式,具體如下:
multiprocessing.Process(target=要執行操作,args = (要操作的函式的引數))
- 啟動程式
呼叫start方法
p1.start()
完成的程式如下:
def work_1(f,n):
print('work_1 start')
for i in range(n):
with open(f,'a') as fs:
fs.write('i love pyhton \n')
time.sleep(1)
print('work_1 end')
def work_2(f,n):
print('work_2 start')
for i in range(n):
with open(f,'a') as fs:
fs.write('i love java \n')
time.sleep(1)
print('work_2 end')
if __name__ == '__main__':
p1 = multiprocessing.Process(target=work_1,args = ('file.txt',3))
p2 = multiprocessing.Process(target=work_2, args=('file.txt', 3))
p1.start()
p2.start()
3.程式鎖
- 程式鎖
使用multiprocessing.Lock()建立程式鎖
lock=multiprocessing.Lock()
- 獲取程式鎖
使用acquire()獲取程式鎖
lock.acquire()
- 釋放程式鎖
使用release()獲取程式鎖
lock.release()
完整的程式如下
def work_1(f,n,lock):
print('work_1 start')
lock.acquire()
for i in range(n):
with open(f,'a') as fs:
fs.write('i love pyhton \n')
time.sleep(1)
print('work_1 end')
lock.release()
def work_2(f,n,lock):
print('work_2 start')
lock.acquire()
for i in range(n):
with open(f,'a') as fs:
fs.write('i love java \n')
time.sleep(1)
print('work_2 end')
lock.release()
if __name__ == '__main__':
lock=multiprocessing.Lock()
p1 = multiprocessing.Process(target=work_1,args = ('file.txt',3,lock))
p2 = multiprocessing.Process(target=work_2, args=('file.txt', 3,lock))
p1.start()
p2.start()
- 加程式鎖後變成了與單程式一樣
4.程式池
- 建立程式池
使用multiprocessing.Pool(程式池個數)建立程式池
pool=multiprocessing.Pool(2)
- 使用程式池
使用apply_async使用程式池
pool.apply_async(work,args=(i,))
使用apply使用程式池
pool.apply(work,args=(i,))
- 結束程式池工作
比較危險,不要輕易用,直接殺死程式池
pool.terminate()
- 阻塞主程式
join阻塞主程式,當子程式執行完畢的時候會繼續往後執行,使用join必須在程式池使用terminate或者close
pool.join()
完成流程如下:
def work(n):
print('run work (%s) ,work id %s'%(n,os.getpid()))
time.sleep(5)
print('work (%s) stop ,work id %s'%(n,os.getpid()))
if __name__=='__main__':
print('Parent process %s.' % os.getpid())
p = multiprocessing.Pool(3)
for i in range(5):
p.apply_async(work, args=(i,))#同時執行3個,釋放了其中一個在執行其他剩餘
#p.apply(work, args=(i,))#一個一個執行,執行完一個才能執行下一個
p.close()
p.join()
5.程式佇列
- 建立程式佇列
multiprocessing.Queue()
#queue 跨程式通訊
def put(q):
for value in ['A', 'B', 'C']:
print ('傳送 %s 到 queue...' % value)
q.put(value) #通過put傳送
time.sleep(2)
## 讀資料程式執行的程式碼:
def get(q):
while True:
value = q.get(True) #接受佇列中的資料
print ('從 queue 接受 %s .' % value)
if __name__=='__main__':
# 父程式建立Queue,並傳給各個子程式:
q = multiprocessing.Queue()
pw = multiprocessing.Process(target=put, args=(q,))
pr = multiprocessing.Process(target=get, args=(q,))
# 啟動子程式pw,寫入:
pw.start()
# 啟動子程式pr,讀取:
pr.start()
# 等待pw結束:
pw.join()
# pr程式裡是死迴圈,無法等待其結束,只能強行終止:
pr.terminate()
6.管道通訊
multiprocessing.Pipe()#雙向,即可發也可收
multiprocessing.Pipe(duplex=False) #左收右發
def put(p):
for value in ['A', 'B', 'C']:
print ('傳送 %s 到 pipe...' % value)
p[1].send(value)
time.sleep(2)
# 讀資料程式執行的程式碼:
def get(p):
while True:
value = p[0].recv()
print ('從 pipe 接受 %s .' % value)
if __name__=='__main__':
# 父程式建立Queue,並傳給各個子程式:
# p = multiprocessing.Pipe()
p = multiprocessing.Pipe(duplex=False) #左收右發
pw = multiprocessing.Process(target=put, args=(p,))
pr = multiprocessing.Process(target=get, args=(p,))
# 啟動子程式pw,寫入:
pw.start()
# 啟動子程式pr,讀取:
pr.start()
# 等待pw結束:
pw.join()
# pr程式裡是死迴圈,無法等待其結束,只能強行終止:
pr.terminate()
相關文章
- Python學習筆記|Python之yield理解Python筆記
- Python學習筆記|Python之索引迭代Python筆記索引
- Python學習筆記|Python之特殊方法Python筆記
- Python學習筆記—程式碼Python筆記
- Python學習筆記 - 多程式Python筆記
- Python學習筆記|Python之執行緒Python筆記執行緒
- Python學習筆記|Python之檔案操作Python筆記
- Python學習筆記|Python之物件導向Python筆記物件
- Python學習筆記|Python之特殊檔案Python筆記
- Python學習筆記|Python之推導式Python筆記
- Python學習筆記|Python之正規表示式Python筆記
- Python學習筆記|Python之pycache資料夾Python筆記
- Python學習筆記之12306搶票Python筆記
- Python學習筆記Python筆記
- 【學習筆記】python筆記Python
- Python學習筆記|Python之內建變數__name__Python筆記變數
- Python 3 學習筆記之——物件導向Python筆記物件
- python學習筆記(1Python筆記
- Python學習筆記 - queuePython筆記
- Effective Python學習筆記Python筆記
- python——Matplotlib學習筆記Python筆記
- python學習筆記4Python筆記
- Python學習筆記 - asyncioPython筆記
- Python 學習筆記(一)Python筆記
- Python學習筆記 - aiohttpPython筆記AIHTTP
- python學習筆記(二)Python筆記
- Python學習筆記(2)Python筆記
- python——numpy學習筆記Python筆記
- Python學習筆記(三)Python筆記
- (十五) 學習筆記: Python程式(Process)相關筆記Python
- Python學習筆記之 Python設計思想&設計原則Python筆記
- Python 3 學習筆記之——資料型別Python筆記資料型別
- Python 3 學習筆記之——基礎語法Python筆記
- Python 3 學習筆記之類與例項Python筆記
- Python學習筆記 - 閉包Python筆記
- Python學習筆記 - 作用域Python筆記
- Python學習筆記 - 變數Python筆記變數
- Python學習筆記 - time, datetimePython筆記