2016-09-14 27 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()