首页 文章

如何在Python3中与asyncio共享套接字?

提问于
浏览
0

我需要使用 asyncioos.fork() 方法在子进程之间共享套接字 .

data_received() 回调中有一个 heavy_jobs() 函数,它会占用大量的CPU时间 .

import asyncio

class EchoClientProtocol(asyncio.Protocol):
    def __init__(self, message, loop):
        self.message = message
        self.loop = loop

    def data_received(self, data):
        heavy_jobs()

loop = asyncio.get_event_loop()
message = 'Hello World!'
coro = loop.create_connection(lambda: EchoClientProtocol(message, loop),
                              '127.0.0.1', 8000)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()

在传统方法中,我们可以使用 fork() 在子进程和父进程之间共享套接字:

bind(...);
listen(...);
pid = fork();

那么,我怎么能在 asyncio 做同样的事情呢?

1 回答

  • 0

    目前asyncio在事件循环运行时不支持fork(https://bugs.python.org/issue21998) . 你必须fork然后创建循环 . 一个简单的EchoClient,有两个进程:

    import asyncio
    import os
    import socket
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('127.0.0.1', 7777))
    pid = os.fork()
    
    class EchoClientProtocol(asyncio.Protocol):
        def __init__(self, message, loop):
            self.message = message
            self.loop = loop
    
        def data_received(self, data):
            print('Received in %s' % pid)
    
    loop = asyncio.get_event_loop()
    message = 'Hello World!'
    coro = loop.create_connection(lambda: EchoClientProtocol(message, loop), sock=sock)
    loop.run_until_complete(coro)
    loop.run_forever()
    loop.close()
    

    并且简单的测试 - 运行 nc -k -l 7777 ,然后启动客户端(上面的代码) .

    如果您还想编写服务器,只需使用 socket.bindsocket.listen 更改 connect ,当然 asyncio.create_server

相关问题