On Tue, Dec 8, 2015 at 10:45 AM, Al Johri <[email protected]> wrote:

> Hi Ben,
>
>    1. It's my understanding that debug in of itself is a "coroutine
>    function" and running debug() returns a "coroutine object" that can be
>    scheduled within the even loop by creating a task or using ensure_future.
>    Are you saying that I should do
>
>    asyncio.ensure_future(debug().add_done_callback(lambda f: pdb.set_trace
>    ()))
>
>    Sorry if that was supposed to be obvious.
>
>
Ah, right. No, it's not obvious; I was thinking of Tornado's
@gen.coroutine. It's a little more complicated for native coroutines and
asyncio. I'm not sure if there's a better way for this than ensure_future.


>
>    1.
>    2. And if I do this, will I be able to use "up" within pdb to access
>    the local frame of debug? I'd like to see the result of my test code.
>
> You can see the return value of debug() in f.result(). But `debug()` is
`down`, not `up` relative to the breakpoint, and you can't look into it
because it has already returned. To see its locals you'll have to set a
breakpoint inside debug() itself.


> Thanks for the help!
>
> On Tuesday, December 8, 2015 at 10:06:50 AM UTC-5, Ben Darnell wrote:
>>
>> If the event loop is already running, then Tornado's IOLoop.run_sync()
>> won't work either (it may appear to work because we don't do enough
>> checking for improper combinations of run_sync() and start(), but it's not
>> safe).
>>
>> Instead, you should do something like `debug().add_done_callback(lambda
>> f: pdb.set_trace())` and then `continue` (I'm not a pdb user so I'm not
>> sure of the exact commands), so pdb will let the outer event loop run and
>> then break back in once the given coroutine is finished.
>>
>> -Ben
>>
>> On Tue, Dec 8, 2015 at 1:45 AM, Al Johri <[email protected]> wrote:
>>
>>> Hi,
>>>
>>> Similar to how Tornado has a IOLoop.current().run_sync method, is there
>>> anyway that while I'm in pdb I can schedule a coroutine or future, have it
>>> execute immediately, and block until it finishes?
>>>
>>> For example, if I'm writing to a database and I need to test something,
>>> I'd like to be able to type within pdb "await db.insert(mydocument)" for
>>> testing purposes and have it execute immediately.
>>>
>>> Just curious if this is even within the realm of possibility; I'm rather
>>> new to asyncio so I apologize if this has been discussed before or is
>>> completely preposterous.
>>>
>>> I've tried to do things like, write a coroutine called "debug" such as:
>>>
>>> async def debug():
>>>     await db.insert(mydocument)
>>>
>>> and then within pdb do something along the lines of
>>>
>>> loop.run_until_complete(debug())
>>>
>>> but obviously this can't be done as the loop is already running.
>>>
>>> Would love any insight on how to achieve this. Thanks!
>>>
>>> Al
>>>
>>
>>

Reply via email to