国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現進程同步和通信的方法

2020-02-16 11:21:48
字體:
來源:轉載
供稿:網友

Python中的多線程其實并不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。Python提供了非常好用的多進程包multiprocessing,只需要定義一個函數,Python會完成其他所有事情。借助這個包,可以輕松完成從單進程到并發執行的轉換。multiprocessing支持子進程、通信和共享數據、執行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。

引例:

如之前創建多進程的例子

# -*- coding:utf-8 -*-from multiprocessing import Process,Poolimport os,timedef run_proc(name):    ##定義一個函數用于進程調用  for i in range(5):      time.sleep(0.2)  #休眠0.2秒    print 'Run child process %s (%s)' % (name, os.getpid())#執行一次該函數共需1秒的時間if __name__ =='__main__': #執行主進程  print 'Run the main process (%s).' % (os.getpid())  mainStart = time.time() #記錄主進程開始的時間  p = Pool(8)      #開辟進程池  for i in range(16):                 #開辟14個進程    p.apply_async(run_proc,args=('Process'+str(i),))#每個進程都調用run_proc函數,                            #args表示給該函數傳遞的參數。  print 'Waiting for all subprocesses done ...'  p.close() #關閉進程池  p.join() #等待開辟的所有進程執行完后,主進程才繼續往下執行  print 'All subprocesses done'  mainEnd = time.time() #記錄主進程結束時間  print 'All process ran %0.2f seconds.' % (mainEnd-mainStart) #主進程執行時間

運行結果:

Run the main process (36652). Waiting for all subprocesses done … Run child process Process0 (36708)Run child process Process1 (36748)Run child process Process3 (36736) Run child process Process2 (36716) Run child process Process4 (36768)

如第3行的輸出,偶爾會出現這樣不如意的輸入格式,為什么呢?

原因是多個進程爭用打印輸出資源的結果。前一個進程為來得急輸出換行符,該資源就切換給了另一個進程使用,致使兩個進程輸出在同一行上,而前一個進程的換行符在下一次獲得資源時才打印輸出。

Lock

為了避免這種情況,需在進程進入臨界區(使進程進入臨界資源的那段代碼,稱為臨界區)時加鎖。
可以向如下這樣添加鎖后看看執行效果:

# -*- coding:utf-8 -*-lock = Lock()  #申明一個全局的lock對象def run_proc(name):  global lock   #引用全局鎖  for i in range(5):    time.sleep(0.2)    lock.acquire() #申請鎖    print 'Run child process %s (%s)' % (name, os.getpid())    lock.release()  #釋放鎖

Semaphore

Semaphore為信號量機制。當共享的資源擁有多個時,可用Semaphore來實現進程同步。其用法和Lock差不多,s = Semaphore(N),每執行一次s.acquire(),該資源的可用個數將減少1,當資源個數已為0時,就進入阻塞;每執行一次s.release(),占用的資源被釋放,該資源的可用個數增加1。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 香港 | 五河县| 江津市| 北川| 靖安县| 信阳市| 红安县| 宝兴县| 白城市| 韶关市| 石景山区| 宜春市| 沙坪坝区| 河北省| 周至县| 灵台县| 平远县| 大余县| 苏州市| 东台市| 宁陵县| 西藏| 灵丘县| 德保县| 镇赉县| 马鞍山市| 玉田县| 宁海县| 措勤县| 光泽县| 新昌县| 即墨市| 大同县| 恭城| 秦安县| 六盘水市| 桐柏县| 新闻| 临颍县| 渝北区| 阿拉善左旗|