最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2014年09月16日 10:38:13   投稿:shichen2014  
這篇文章主要介紹了Python多進程編程技術,包括了線程、隊列、同步等概念及相關的技巧總結,需要的朋友可以參考下

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

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

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

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是該方法的參數(shù)列表。啟動進程類似于啟動Thread,必須要調用start方法。也可以繼承Process,覆蓋run方法,在run方法中實現(xiàn)該進程的邏輯。調用join方法會阻塞當前調用進程,直到被調用進程運行結束。
手工終止一個進程可以調用terminate方法,在UNIX系統(tǒng)中,該方法會發(fā)送SIGTERM信號量,而在windows系統(tǒng)中,會借助TerminateProcess方法。需要注意的是,exit處理邏輯并不會被執(zhí)行,該進程的子進程不會被終止,他們只會變成孤兒進程。

Queue

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

get方法可以從隊列讀取并且刪除一個元素。同樣,get方法有兩個可選參數(shù):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參數(shù),如果duplex參數(shù)為True(默認值),那么這個管道是全雙工模式,也就是說conn1和conn2均可收發(fā)。duplex為False,conn1只負責接受消息,conn2只負責發(fā)送消息。

send和recv方法分別是發(fā)送和接受消息的方法。例如,在全雙工模式下,可以調用conn1.send發(fā)送消息,conn1.recv接收消息。如果沒有消息可接收,recv方法會一直阻塞。如果管道已經(jīng)被關閉,那么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多線程開發(fā)的同學是不是覺得很熟悉,和java的Concurrency API很像,不過javaConcurrency是處理多線程的而已,我們可以直接按照以前Java多線程的經(jīng)驗用這些API。

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

相關文章

  • python imutils包基本概念及使用

    python imutils包基本概念及使用

    python imutils包可以很簡潔的調用opencv接口,輕松實現(xiàn)圖像的平移,旋轉,縮放,骨架化等操作,對python imutils包基本概念及使用方法感興趣的朋友一起看看吧
    2021-07-07
  • Python Pillow.Image 圖像保存和參數(shù)選擇方式

    Python Pillow.Image 圖像保存和參數(shù)選擇方式

    今天小編就為大家分享一篇Python Pillow.Image 圖像保存和參數(shù)選擇方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Pytest使用logging模塊寫日志的實例詳解

    Pytest使用logging模塊寫日志的實例詳解

    logging是python語言中的一個日志模塊,專門用來寫日志的,日志級別通常分為debug、info、warning、error、critical幾個級別,一般情況下,默認的日志級別為warning,在調試或者測試階段,下面就快速體驗一下logging模塊寫日志的用法,感興趣的朋友跟隨小編一起看看吧
    2022-12-12
  • python用700行代碼實現(xiàn)http客戶端

    python用700行代碼實現(xiàn)http客戶端

    這篇文章主要介紹了python用700行代碼實現(xiàn)http客戶端的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • 解決jupyter不是內部或外部命令,也不是可運行程序問題

    解決jupyter不是內部或外部命令,也不是可運行程序問題

    這篇文章主要介紹了解決jupyter不是內部或外部命令,也不是可運行程序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 利用PyInstaller將python程序.py轉為.exe的方法詳解

    利用PyInstaller將python程序.py轉為.exe的方法詳解

    這篇文章主要給大家介紹了利用PyInstaller將python程序.py轉為.exe的方法,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • 使用python獲取cpu每秒的使用率

    使用python獲取cpu每秒的使用率

    這篇文章主要介紹了使用python獲取cpu每秒的使用率,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 詳解解決Python memory error的問題(四種解決方案)

    詳解解決Python memory error的問題(四種解決方案)

    這篇文章主要介紹了詳解解決Python memory error的問題(四種解決方案),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Python中csv文件的寫入與讀取方法例子

    Python中csv文件的寫入與讀取方法例子

    這篇文章主要給大家介紹了關于Python中csv文件的寫入與讀取方法的相關資料,csv是"Comma-Separated Values(逗號分割的值)"的首字母縮寫,它其實和txt文件一樣,都是純文本文件,使用Python來讀寫csv文件是非常容易的,需要的朋友可以參考下
    2023-09-09
  • 使用Pandas修改DataFrame中某一列的值

    使用Pandas修改DataFrame中某一列的值

    DataFrame是Pandas中的主要數(shù)據(jù)結構之一,下面這篇文章主要給大家介紹了關于使用Pandas修改DataFrame中某一列的值的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-12-12

最新評論

边坝县| 留坝县| 大宁县| 扶余县| 台南市| 临清市| 桐梓县| 平邑县| 临沧市| 宝应县| 明溪县| 泸西县| 崇文区| 科尔| 宜宾县| 焉耆| 普格县| 镇沅| 昌乐县| 新余市| 临颍县| 民权县| 陆丰市| 永兴县| 济源市| 德州市| 高雄市| 涡阳县| 通榆县| 丹凤县| 怀集县| 华安县| 深泽县| 兴国县| 玉田县| 渝北区| 镇江市| 东明县| 陈巴尔虎旗| 铅山县| 杭锦后旗|