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

首頁 > 編程 > Python > 正文

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

2019-11-25 18:13:15
字體:
來源:轉載
供稿:網友

本文以實例形式分析了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 Processimport osimport timedef 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, Queuedef 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, Pipedef 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, Lockdef 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程序設計的學習有一定的借鑒價值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通江县| 弥勒县| 如东县| 勃利县| 平遥县| 云浮市| 章丘市| 闽侯县| 大埔区| 柯坪县| 许昌市| 荆州市| 万源市| 县级市| 汝州市| 贵州省| 迭部县| 东乌| 丹东市| 星座| 拜城县| 子洲县| 贵定县| 兰溪市| 平罗县| 临城县| 红安县| 海城市| 临潭县| 沂水县| 汉川市| 达尔| 鄂托克前旗| 桦南县| 木兰县| 阳高县| 西和县| 铜陵市| 扶风县| 黄山市| 大埔区|