欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python多進程編程技術實例分析

系統 1642 0

本文以實例形式分析了Python多進程編程技術,有助于進一步Python程序設計技巧。分享給大家供大家參考。具體分析如下:

一般來說,由于Python的線程有些限制,例如多線程不能充分利用多核CPU等問題,因此在Python中我們更傾向使用多進程。但在做不阻塞的異步UI等場景,我們也會使用多線程。本篇文章主要探討Python多進程的問題。

Python在2.6引入了多進程的機制,并提供了豐富的組件及api以方便編寫并發應用。multiprocessing包的組件Process, Queue, Pipe, Lock等組件提供了與多線程類似的功能。使用這些組件,可以方便地編寫多進程并發程序。

Process

Process的使用有點像java.lang.Thread,但Thread是線程。start方法用以啟動某個進程。一個簡單的示例:

            
from multiprocessing import Process
import os
import time
def sleeper(name, seconds):
  print "Process ID# %s" % (os.getpid())
  print "Parent Process ID# %s" % (os.getppid())
  print "%s will sleep for %s seconds" % (name, seconds)
  time.sleep(seconds)

if __name__ == "__main__":
  child_proc = Process(target=sleeper, args=('bob', 5))
  child_proc.start()
  print "in parent process after child process start"
  print "parent process abount to join child process"
  child_proc.join()
  print "in parent process after child process join"
  print "the parent's parent process: %s" % (os.getppid())


          

實例化一個Process必須要指定target和args。target是新的進程的入口方法,可以認為是main方法。args是該方法的參數列表。啟動進程類似于啟動Thread,必須要調用start方法。也可以繼承Process,覆蓋run方法,在run方法中實現該進程的邏輯。調用join方法會阻塞當前調用進程,直到被調用進程運行結束。
手工終止一個進程可以調用terminate方法,在UNIX系統中,該方法會發送SIGTERM信號量,而在windows系統中,會借助TerminateProcess方法。需要注意的是,exit處理邏輯并不會被執行,該進程的子進程不會被終止,他們只會變成孤兒進程。

Queue

Queue是多進程安全的隊列,可以使用Queue實現多進程之間的數據傳遞。put方法用以插入數據到隊列中,put方法還有兩個可選參數:blocked和timeout。如果blocked為True(默認值),并且timeout為正值,該方法會阻塞timeout指定的時間,直到該隊列有剩余的空間。如果超時,會拋出Queue.Full異常。如果blocked為False,但該Queue已滿,會立即拋出Queue.Full異常。

get方法可以從隊列讀取并且刪除一個元素。同樣,get方法有兩個可選參數:blocked和timeout。如果blocked為True(默認值),并且timeout為正值,那么在等待時間內沒有取到任何元素,會拋出Queue.Empty異常。如果blocked為False,有兩種情況存在,如果Queue有一個值可用,則立即返回該值,否則,如果隊列為空,則立即拋出Queue.Empty異常。Queue的一段示例代碼:

            
from multiprocessing import Process, Queue
def offer(queue):
  queue.put("Hello World")
def test(queue, num):
  queue.put("Hello World: " + str(num))
if __name__ == '__main__':
  q = Queue()
  p1 = Process(target=test, args=(q, 1))
  p1.start()
  p = Process(target=offer, args=(q,))
  p.start()
  p2 = Process(target=test, args=(q, 2))
  p2.start()
  p2 = Process(target=test, args=(q, 3))
  p2.start()
  print q.get()
  print q.get()
  print q.get()
  print q.get()
  print q.close()


          

輸出:

Hello World: 1
Hello World
Hello World: 2
None

Pipes

Pipe方法返回(conn1, conn2)代表一個管道的兩個端。Pipe方法有duplex參數,如果duplex參數為True(默認值),那么這個管道是全雙工模式,也就是說conn1和conn2均可收發。duplex為False,conn1只負責接受消息,conn2只負責發送消息。

send和recv方法分別是發送和接受消息的方法。例如,在全雙工模式下,可以調用conn1.send發送消息,conn1.recv接收消息。如果沒有消息可接收,recv方法會一直阻塞。如果管道已經被關閉,那么recv方法會拋出EOFError。

            
from multiprocessing import Process, Pipe

def send(conn):
  conn.send("Hello World")
  conn.close()
if __name__ == '__main__':
  parent_conn, child_conn = Pipe()
  p = Process(target=send, args=(child_conn,))
  p.start()
  print parent_conn.recv()


          

同步

multiprocessing包提供了Condition, Event, Lock, RLock, Semaphore等組件可用于同步。下面是使用Lock的一個示例:

            
from multiprocessing import Process, Lock
def l(lock, num):
  lock.acquire() 
  print "Hello Num: %s" % (num)
  lock.release()
if __name__ == '__main__':
  lock = Lock()
for num in range(20):
  Process(target=l, args=(lock, num)).start()


          

總結

以上是Python multiprocessing庫的簡單介紹和實例,熟悉Java多線程開發的同學是不是覺得很熟悉,和java的Concurrency API很像,不過javaConcurrency是處理多線程的而已,我們可以直接按照以前Java多線程的經驗用這些API。

感興趣的朋友可以測試運行本文實例以加深理解。相信本文所述對大家Python程序設計的學習有一定的借鑒價值。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 中文字幕亚洲一区 | 日本亚洲视频 | 波多野结衣一区二区三区四区 | 久久艹免费视频 | 99久热re在线精品99 6热视频 | 日本成日本片人免费 | 欧美aaa级| 麻豆影视在线 | 国产在线视频2019最新视频 | 欧美极品在线观看 | 日韩在线观看视频一区二区三区 | 韩国草草影院 | 亚洲色综合dddd97.com | 一区二区三区在线免费观看 | 国产综合亚洲精品一区二 | av在线电影网址 | 欧美视频区| 亚洲国产精久久久久久久 | av一区二区三区四区 | 色男人的天堂 | 午夜精品电影 | 成人欧美一区二区三区视频xxx | 午夜精品久久久久久久99热浪潮 | 亚洲黄网视频 | 国产毛片一级 | 天天干天天操天天透 | 国产欧美日本亚洲精品五区 | 久久精品国产亚洲一区二区 | 亚洲欧美日韩中文综合在线不卡 | 精品欧美一区二区在线观看 | 香蕉成人啪国产精品视频综合网 | 99thz桃花论坛 | 成人高清网站 | 日韩一区二区福利 | 天天看天天爽天天摸天天添 | 中文字幕国产一区 | 国产精品久久久久亚洲 | 一级@片 | 激情大乳女做爰办公室韩国 | 一级片网 | 无遮挡啪啪成人免费网站 |