memo

2019-06-23

ipython で twisted の deferred を await する

気付いてなかったけど、 ipython で await できるようになっていた

ドキュメントを読むに、なんか関数書けば対応を足せそうだったので、 twisted の deferred を await できるようにしてみる。

twisted は asyncio と違って、一度 reactor を動かしてしまうと止められなくなってしまうので、そのへんいい感じにやってくれる crochet を利用しつつ、以下のようなコードを置いておく。

$HOME/.ipython/profile_default/startup/99-twisted_runner.py:

try:
    import crochet

    from twisted.internet import defer

except ImportError:
    pass

else:
    def twisted_runner(deferred):
        crochet.setup()
        result = crochet.run_in_reactor(
            lambda: defer.ensureDeferred(deferred))()

        return result.wait(2**31)

後は %autoawait twisted_runner で有効にする。

こんな感じ:

In [1]: %autoawait twisted_runner

In [2]: import treq

In [3]: r = await treq.get('http://localhost')

In [4]: data = await r.text()

In [5]: print(data)
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...