如何在 Python3 中与 asyncio 共享套接字?
How to share socket with asyncio in Python3?
我需要使用 asyncio
和 os.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
中做同样的事情呢?
目前 asyncio 不支持 fork,而事件循环是 运行ning (https://bugs.python.org/issue21998)。您必须分叉然后创建循环。具有两个进程的简单 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
,然后启动客户端(上面的代码)。
如果你也想写服务器,把connect
改成socket.bind
和socket.listen
当然还有asyncio.create_server
我需要使用 asyncio
和 os.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
中做同样的事情呢?
目前 asyncio 不支持 fork,而事件循环是 运行ning (https://bugs.python.org/issue21998)。您必须分叉然后创建循环。具有两个进程的简单 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
,然后启动客户端(上面的代码)。
如果你也想写服务器,把connect
改成socket.bind
和socket.listen
当然还有asyncio.create_server