python中多程序與linux 下的c基本相同。
fork的基本使用
先看最簡單的例子:
#coding: utf-8
import
osdef
my_fork():
pid =os.fork()
if pid ==0:
'this is child, pid = %d, parent id = %d
' %(os.getpid(), os.getppid())
elif pid >0:
'this is parent, pid = %d, child id = %d
' %(os.getpid(), pid)
os.waitpid(pid, 0)
#等待子程序結束
if__name__ == '
__main__':
my_fork()
這個例子演示了fork的基本使用,還有就是我們最後使用了waitpid來**子程序。
如果不知道具體的子程序號碼,可以使用wait函式。
管道pipe的使用
**如下:
#coding: utf-8
import
osfrom time import
sleep
defmy_fork():
r, w =os.pipe()
pid =os.fork()
if pid ==0:
os.close(r)
#關閉讀端
w = os.fdopen(w, "w"
)
for i in range(10):
w.write(
'%s\n
' % (str(i+1))) #
最後加上\n
w.flush() #
這裡記得重新整理
sleep(0.5)
w.close()
elif pid >0:
os.close(w)
#關閉寫端
r = os.fdopen(r, "r"
)
while
true:
data = r.readline() #
不要使用read
ifnot
data:
'close.
'break
;
'received : %s
' %(data)
os.waitpid(pid, 0)
#等待子程序結束
if__name__ == '
__main__':
my_fork()
在子程序中,連續10次傳送數字。
這裡有幾點值得注意:
write時加上\n符號使用訊號處理殭屍程序接收時使用readline函式
每傳送完乙個資料,就重新整理flush一次緩衝區
python中也可以使用訊號處理函式,例如最簡單的中斷訊號:
#coding: utf-8
import
osimport
signal
from time import
sleep
defhandler(a, b):
'ctrl + c'if
__name__ == '
__main__':
signal.signal(signal.sigint, handler)
while
true:
pass
每按一次ctrl+c,就觸發一次這個函式。
**如下:
#coding: utf-8
import
osimport
signal
from time import
sleep
defhandler(a, b):
(pid, status) =os.wait()
'child %d finish, status = %d
' %(pid, status)
defmy_fork():
pid =os.fork()
if pid ==0:
'this is child, pid = %d, parent id = %d
' %(os.getpid(), os.getppid())
elif pid >0:
'this is parent, pid = %d, child id = %d
' %(os.getpid(), pid)
while
true:
pass
if__name__ == '
__main__':
signal.signal(signal.sigchld, handler)
my_fork()
每當有子程序消亡,就觸發sigchld訊號,然後在處理函式中呼叫wait函式。這裡比linux下簡單,不必使用while迴圈**。
下節使用python,編寫乙個多程序的併發伺服器。
完。
python學習筆記四(python多程序)
寫之前在猶豫,是否需要將多執行緒放在這個之前講或者將多執行緒和多程序合到一起講python的併發性,鑑於內容較多,還是分為兩個吧。這次將介紹multiprocessing模組的用法 怎麼寫多程序程式 程序間通訊 程序間資料共享等。由於python使用了內部的gil,在任意時刻只允許單個執行緒執行,無...
python學習筆記(六) 多程序
依據廖雪峰官方 的python教程整理 import os 多程序 unix linux作業系統提供了乙個fork 系統呼叫,os.fork 封裝了fork系統呼叫,windows系統無法使用 print process s start.os.getpid pid os.fork if pid 0 ...
Python 學習筆記 多程序爬蟲
前段時間學習了多執行緒,但在實際的情況中對於多執行緒的速度實在不滿意,所以今天就來學學多程序分布式爬蟲,在這裡感謝莫煩的python教程。在講述多程序之前,先來回顧一下之前學習的多執行緒。對於多執行緒可以簡單的理解成運輸快遞的貨車,雖然在整個運輸快遞的途中有很多貨車參與運輸,但快遞到你手中的時間並不...