briskly
briskly

Reputation: 193

Can I use curio with sanic. Why not?

I tried to use async raw socket in my sanic application on Python 3.6 And was really surprised that async functions from curio doesn't work in sanic async context. Minimal proof of concept:

import curio
from sanic import Sanic
from sanic.response import text
app = Sanic(__name__)


@app.route('/')
async def index(request):
    sock = await curio.open_connection("google.com", 443, ssl=True)
    resp = await sock.recv(1024)
    return text(resp)


app.run(host="0.0.0.0", port=5001)

This code generates core dump on any http request

$ python3 test2.py 
2017-04-17 17:33:13,266: INFO: Goin' Fast @ http://0.0.0.0:5001
2017-04-17 17:33:13,270: INFO: Starting worker [93060]
Fatal Python error: GC object already tracked

Current thread 0x00007fc57706e480 (most recent call first):
  File "/usr/lib/python3.6/linecache.py", line 165 in lazycache
  File "/usr/lib/python3.6/traceback.py", line 345 in extract
  File "/usr/lib/python3.6/traceback.py", line 497 in __init__
  File "/usr/lib/python3.6/traceback.py", line 117 in format_exception
  File "/usr/lib/python3.6/traceback.py", line 163 in format_exc
  File "/usr/lib/python3.6/site-packages/sanic/handlers.py", line 93 in default
  File "/usr/lib/python3.6/site-packages/sanic/handlers.py", line 70 in response
  File "/usr/lib/python3.6/site-packages/sanic/app.py", line 472 in handle_request
  File "/usr/lib/python3.6/site-packages/sanic/server.py", line 410 in serve
  File "/usr/lib/python3.6/site-packages/sanic/app.py", line 561 in run
  File "test2.py", line 14 in <module>
Aborted (core dumped)

Upvotes: 1

Views: 545

Answers (1)

vishes_shell
vishes_shell

Reputation: 23494

For linking this question with github issue, that has been raised by OP.

Using curio in sanic controller.

Sum up(from issue comments):

From the official Curio docs: "Curio can also submit work to the asyncio event loop with the provision that it must be running separately in a different thread."

Look at this issue

Curio's main implementation of events is a queue, not an event loop. You're trying to spawn tasks inside the same thread Sanic (and the event loop) are running from.

Upvotes: 2

Related Questions