这里主要是两个进程中共享数据,本质是共享内存。采用I/O流的方式来访问。
有两种管道:
①匿名管道:父子进程间通信;
②命名管道:两个进程间通信。
Python代码如下:
server.py
- # -*- coding: utf-8 -*-
-
- import win32file
- import win32pipe
-
- PIPE_NAME = r"\\.\pipe\test_pip"
- PIPE_BUFFER_SIZE = 65535
-
- # PIPE_ACCESS_DUPLEX 双向通信
- namedPipe = win32pipe.CreateNamedPipe(PIPE_NAME,
- win32pipe.PIPE_ACCESS_DUPLEX,
- win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT | win32pipe.PIPE_READMODE_MESSAGE,
- win32pipe.PIPE_UNLIMITED_INSTANCES,
- PIPE_BUFFER_SIZE,
- PIPE_BUFFER_SIZE, 500, None)
-
- if __name__ == '__main__':
-
- while True:
- try:
- win32pipe.ConnectNamedPipe(namedPipe, None)
- data = win32file.ReadFile(namedPipe, PIPE_BUFFER_SIZE, None)
- if data is None or len(data) < 2:
- continue
-
- print("receive msg : ", str(data))
- pass
- except Exception as e:
- print(e)
- pass
-
- try:
- win32pipe.DisconnectNamedPipe(namedPipe)
- pass
- except Exception as e:
- print(e)
- pass
- pass
client.py
- # -*- coding: utf-8 -*-
-
- import win32pipe
- import win32file
- import time
-
- PIPE_NAME = r"\\.\pipe\test_pip"
-
- fileHandle = win32file.CreateFile(PIPE_NAME,
- win32file.GENERIC_READ | win32file.GENERIC_WRITE,
- win32file.FILE_SHARE_WRITE, None,
- win32file.OPEN_EXISTING, 0, None)
-
- if __name__ == '__main__':
- try:
- for i in range(1, 100):
- msg = str(i)
- print("send msg: " + msg)
- win32file.WriteFile(fileHandle, msg.encode())
- time.sleep(1)
- pass
- pass
- except Exception as e:
- print(e)
- pass
- finally:
- try:
- win32file.CloseHandle(fileHandle)
- pass
- except Exception as e:
- print(e)
- pass
- pass
- pass
程序运行截图如下:
客户端:
服务端:
需要注意的地方:
- # PIPE_ACCESS_DUPLEX 该管道是双向的,服务器和客户端进程都可以从管道读取或者向管道写入数据。
- # PIPE_ACCESS_INBOUND 该管道中数据是从客户端流向服务端,即客户端只能写,服务端只能读。
- # PIPE_ACCESS_OUTBOUND 该管道中数据是从服务端流向客户端,即客户端只能读,服务端只能写。
-
- # PIPE_TYPE_BYTE 数据作为一个连续的字节数据流写入管道。
- # PIPE_TYPE_MESSAGE 数据用数据块(名为“消息”或“报文”)的形式写入管道。
- # PIPE_READMODE_BYTE 数据以单独字节的形式从管道中读出。
- # PIPE_READMODE_MESSAGE 数据以名为“消息”的数据块形式从管道中读出(要求指定PIPE_TYPE_MESSAGE)。
- # PIPE_WAIT 同步操作在等待的时候挂起线程。
- # PIPE_NOWAIT 同步操作立即返回。