2016-09-14 23 views
4

在下面的例子:Python调试器不能进入协程?

import asyncio 
import ipdb 

class EchoServerProtocol: 
    def connection_made(self, transport): 
     self.transport = transport 

    def datagram_received(self, data, addr): 
     message = data.decode() 
     print('Received %r from %s' % (message, addr)) 
     print('Send %r to %s' % (message, addr)) 
     self.transport.sendto(data, addr) 

loop = asyncio.get_event_loop() 
ipdb.set_trace(context=21) 
print("Starting UDP server") 
# One protocol instance will be created to serve all client requests 
listen = loop.create_datagram_endpoint( EchoServerProtocol, local_addr=('127.0.0.1', 9999)) 
transport, protocol = loop.run_until_complete(listen) 

try: 
    loop.run_forever() 
except KeyboardInterrupt: 
    pass 

transport.close() 
loop.close() 

我想步入

loop.create_datagram_endpoint( EchoServerProtocol, local_addr=('127.0.0.1', 9999))

了解它内部的行为。 但是,当我尝试进入协程时,调试器跳过它,好像n已被按下而不是s

> ../async_test.py(18)<module>() 
    17 # One protocol instance will be created to serve all client requests 
---> 18 listen = loop.create_datagram_endpoint( EchoServerProtocol, local_addr=('127.0.0.1', 9999)) 
    19 transport, protocol = loop.run_until_complete(listen) 

ipdb> s 
> ../async_test.py(19)<module>() 
    18 listen = loop.create_datagram_endpoint( EchoServerProtocol, local_addr=('127.0.0.1', 9999)) 
---> 19 transport, protocol = loop.run_until_complete(listen) 
    20 

ipdb> 

PyCharm(2016 2.3社区)IDE的行为经验。

我期望结束here并能够通过代码额外执行操作。

回答

3

它的工作原理,如果你打电话awaityield from你像协程

listen = await loop.create_datagram_endpoint(EchoServerProtocol, 
              local_addr=('127.0.0.1', 9999)) 

在您的例子listen不是协程执行,但协同程序实例本身的结果。 实际执行由下一行执行:loop.run_until_complete()