歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python進(jìn)程命名管道詳解

發(fā)布時(shí)間:2017-08-29 21:10  回復(fù):0  查看:2836   最后回復(fù):2017-08-29 21:10  
本文和大家分享的主要是python 進(jìn)程間通信的命名管道相關(guān)內(nèi)容,一起來看看吧,希望對(duì)大家 學(xué)習(xí)python有所幫助。
  管道是一種簡(jiǎn)單的FIFO 通信信道,它是單向通信的。 通常啟動(dòng)進(jìn)程創(chuàng)建一個(gè)管道,然后這個(gè)進(jìn)程創(chuàng)建一個(gè)或者多個(gè)進(jìn)程子進(jìn)程接受管道信息,由于管道是單向通信,所以經(jīng)常需要?jiǎng)?chuàng)建兩個(gè)管道來實(shí)現(xiàn)雙向通信。
  命名管道是對(duì)傳統(tǒng)管道的擴(kuò)展,默認(rèn)的管道是匿名管道,只在程序運(yùn)行時(shí)存在;而命名管道是持久化的,當(dāng)不需要時(shí)需要?jiǎng)h除它。
  命名管道使用文件系統(tǒng),由mkfifo() 方法創(chuàng)建。一旦創(chuàng)建了,兩個(gè)獨(dú)立的進(jìn)程都可以訪問它,一個(gè)讀,另外一個(gè)寫。
  命名管道支持阻塞讀和阻塞寫操作:  如果一個(gè)進(jìn)程打開文件讀,它會(huì)阻塞直到另外一個(gè)進(jìn)程寫。  但是我們可以指定O_NONBLOCK 選項(xiàng)來啟用非阻塞模式。
  命名管道必須以只讀或者只寫的模式打開,它不能以讀+ 寫的模式打開,因?yàn)樗鼤r(shí)單向通信。如果要實(shí)現(xiàn)雙向通信,必須打開兩個(gè)命名管道。
  下面是一個(gè) Python  使用命名管道來實(shí)現(xiàn)進(jìn)程間通信的例子
   Server 
  import os, time
  read_path = "/tmp/pipe.in"
  write_path = "/tmp/pipe.out"
   if os.path.exists(read_path):
  os.remove(read_path) if os.path.exists(write_path):
  os.remove(write_path)
  os.mkfifo(write_path)os.mkfifo(read_path)
  rf = os.open(read_path, os.O_RDONLY)
  wf = os.open(write_path, os.O_SYNC | os.O_CREAT | os.O_RDWR)
   while True:
  s = os.read(rf, 1024)
  print "received msg: %s" % s
   if len(s) == 0:
  time.sleep(1)
  continue
   if "exit"  in s:
   break
  os.write(wf, s)
  os.close(rf)os.close(wf)
   Client 
  import os
  import time
  write_path = "/tmp/pipe.in"
  read_path = "/tmp/pipe.out"
  wf = os.open(write_path, os.O_SYNC | os.O_CREAT | os.O_RDWR)
  rf = None
   for i  in range(1, 11):
  msg = "msg " + str(i)
  len_send = os.write(wf, msg)
  print "sent msg: %s" % msg
   if rf is None:
  rf = os.open(read_path, os.O_RDONLY)
  s = os.read(rf, 1024)
   if len(s) == 0:
   break
  print "received msg: %s" % s
  time.sleep(1)
  os.write(wf, 'exit')
  os.close(rf)os.close(wf)
   測(cè)試
  ·  首先運(yùn)行 server.py
  ·  然后運(yùn)行 client.py
來源: kongxx 的專欄

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?