Reputation: 193
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
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."
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