2017-08-19 9 views
0

asyncioos.fork()サブプロセス間でソケットを共有する方法を使用する必要があります。Python3でasyncioとソケットを共有するには?

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で同じことを行うだろうか?

答えて

0

現在、イベントループが実行されている間は、asyncioはforkをサポートしていません(https://bugs.python.org/issue21998)。フォークしてループを作成する必要があります。 - クライアントを起動し、その後、nc -k -l 7777を実行します(上記のコード)

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() 

そして簡単なテスト:2つのプロセスとシンプルEchoClient。

あなたも、サーバーを書きたい場合は、単にsocket.bindsocket.listenconnectを変更し、当然のasyncio.create_server

+0

はありがとう、それは本当に便利です – hfawja

関連する問題