2016-05-26 2 views
0

私はdata_received関数でデータベースに非同期要求を行いますが、どうしたらよいか分かりません。 asyncio.sleep(2)で単純なHTTPServerを書きましたが、動作しません。data_receivedでasyncio yieldを修正する方法

import time 
import asyncio 

class HTTPServer: 
    def connection_made(self, transport): 
     self.transport = transport 
     pass 

    def connection_lost(self, exc): 
     pass 

    def eof_received(self): 
     pass 

    @asyncio.coroutine 
    def data_received(self, data): 
     try: 
      #time.sleep(2) 
      yield from asyncio.sleep(2) 

      body = "Hello <br/>\n" 
      response = 'HTTP/1.1 {status}\r\n'.format(status="200") 
      response += 'Content-Length: {size}\r\n'.format(size=len(body)) 
      response += 'Content-Type: text/html; charset=utf-8\r\n'.format(size=len(body)) 
      response += 'Connection: close\r\n'.format(size=len(body)) 
      response += '\r\n' 
      response += body 
      self.transport.write(response.encode('utf-8')) 
     except e: 
      print (e) 
     self.transport.close() 


loop = asyncio.get_event_loop() 
print ('Start server on 0.0.0.0:8080') 
asyncio.ensure_future(loop.create_server(
    lambda: HTTPServer(), 
    '0.0.0.0', 8080 
)) 
try: 
    loop.run_forever() 
    pass 
except KeyboardInterrupt: 
    loop.stop() 

私はコメント行asyncio.coroutineとasyncio.sleep(2)からの利回り、それは動作します。私はasyncio.sleep(2)の代わりにtime.sleep(2)を追加します。しかし、非同期は機能しません。

私は間違っていますか?あなたが使用している

答えて

2

"プロトコル" は、(文書を引用)からです:

18.5.4。トランスポートとプロトコル(コールバックベースのAPI)として明示的に文書によって語ら

は、それが通常のメソッドを呼び出して、あなたがそれを変更することはできませんので、@asyncio」のdata_receivedをラッピングされ、「コールバックベースのAPI」です。コルーチン "は動作しません。

しかし、コルーチンベースのAPIがあります、それはマニュアルの次の章です:

18.5.5。小川(コルーチンベースのAPI)

コルーチンベースのAPIを使用して、あなたの例を書き換え、あなたが得る:あなたは、Python 3.5を使用している場合に使用できることを

import asyncio 


async def request_handler(reader, writer): 
    await asyncio.sleep(2) 
    data = await reader.read(100) 
    message = data.decode() 
    addr = writer.get_extra_info('peername') 
    print("Received %r from %r" % (message, addr)) 

    body = "Hello <br/>\n" 
    response = 'HTTP/1.1 {status}\r\n'.format(status="200") 
    response += 'Content-Length: {size}\r\n'.format(size=len(body)) 
    response += 'Content-Type: text/html; charset=utf-8\r\n'.format(size=len(body)) 
    response += 'Connection: close\r\n'.format(size=len(body)) 
    response += '\r\n' 
    response += body 

    writer.write(response.encode('utf-8')) 
    await writer.drain() 
    writer.close() 

loop = asyncio.get_event_loop() 
coro = asyncio.start_server(request_handler, '127.0.0.1', 8080, loop=loop) 
server = loop.run_until_complete(coro) 

print('Start server on {}'.format(server.sockets[0].getsockname())) 
try: 
    loop.run_forever() 
except KeyboardInterrupt: 
    pass 

# Close the server 
server.close() 
loop.run_until_complete(server.wait_closed()) 
loop.close() 

async defawaitの代わりに、@asyncio.coroutineと私がしたようにyield from

関連する問題