Python进程间通信之命名管道(Windows)

来源:互联网 发布:淘宝联盟买东西省钱 编辑:程序博客网 时间:2024/05/19 09:14

前面文章说了一下 Linux 命名管道的实现,今天看看 Windows 上我们怎么实现。

在 Windows 上的命名管道主要是通过调用 win32 api 的以下方法来实现的:
- win32pipe.CreateNamedPipe()
- win32pipe.ConnectNamedPipe()
- win32file.ReadFile()
- win32file.WriteFile()

下面看一个例子,比较简单,只是需要注意一下命名管道的命名规则。

server.py

import win32fileimport win32pipePIPE_NAME = r'\\.\pipe\test_pipe'PIPE_BUFFER_SIZE = 65535while True:    named_pipe = 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)    try:        while True:            try:                win32pipe.ConnectNamedPipe(named_pipe, None)                data = win32file.ReadFile(named_pipe, PIPE_BUFFER_SIZE, None)                if data is None or len(data) < 2:                    continue                print 'receive msg:', data            except BaseException as e:                print "exception:", e                break    finally:        try:            win32pipe.DisconnectNamedPipe(named_pipe)        except:            pass

client.py

import win32pipe, win32fileimport timePIPE_NAME = r'\\.\pipe\test_pipe'file_handle = win32file.CreateFile(PIPE_NAME,                                   win32file.GENERIC_READ | win32file.GENERIC_WRITE,                                   win32file.FILE_SHARE_WRITE, None,                                   win32file.OPEN_EXISTING, 0, None)try:    for i in range(1, 11):        msg = str(i)        print 'send msg:', msg        win32file.WriteFile(file_handle, msg)        time.sleep(1)finally:    try:        win32file.CloseHandle(file_handle)    except:        pass

测试

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