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

首頁 > 編程 > Python > 正文

詳解Python進程間通信之命名管道

2020-01-04 16:49:48
字體:
來源:轉載
供稿:網友

管道是一種簡單的FIFO通信信道,它是單向通信的。 通常啟動進程創建一個管道,然后這個進程創建一個或者多個進程子進程接受管道信息,由于管道是單向通信,所以經常需要創建兩個管道來實現雙向通信。

命名管道是對傳統管道的擴展,默認的管道是匿名管道,只在程序運行時存在;而命名管道是持久化的,當不需要時需要刪除它。

命名管道使用文件系統,由mkfifo()方法創建。一旦創建了,兩個獨立的進程都可以訪問它,一個讀,另外一個寫。

命名管道支持阻塞讀和阻塞寫操作: 如果一個進程打開文件讀,它會阻塞直到另外一個進程寫。 但是我們可以指定O_NONBLOCK選項來啟用非阻塞模式。

命名管道必須以只讀或者只寫的模式打開,它不能以讀+寫的模式打開,因為它時單向通信。如果要實現雙向通信,必須打開兩個命名管道。

下面是一個 Python 使用命名管道來實現進程間通信的例子

Server 端

import os, timeread_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 osimport timewrite_path = "/tmp/pipe.in"read_path = "/tmp/pipe.out"wf = os.open(write_path, os.O_SYNC | os.O_CREAT | os.O_RDWR)rf = Nonefor 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)

測試

  • 首先運行server.py
  • 然后運行client.py

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南部县| 阳西县| 锡林郭勒盟| 安吉县| 新化县| 玉门市| 独山县| 镇平县| 习水县| 井冈山市| 汉川市| 留坝县| 宣武区| 玛多县| 富裕县| 芜湖市| 堆龙德庆县| 迁西县| 邵阳市| 枣强县| 丰顺县| 广丰县| 仁怀市| 大关县| 永济市| 老河口市| 公安县| 彰化市| 阿城市| 潼南县| 湘西| 前郭尔| 贞丰县| 类乌齐县| 兴文县| 微博| 凤山市| 南皮县| 栾川县| 通州区| 平乡县|