我有一个用Sanic
编写的项目application = Sanic(__name__)
...
application.run(host=application.config.HOST, port=application.config.PORT,
debug=application.config.DEBUG, log_config=application.config.LOG)
我的网站有一个实时操作部分
对于实时部分我想使用autobahn和sanic循环
我有自定义聊天协议
class ChatServerProtocol(WebSocketServerProtocol):
....
和聊天工厂:
class ChatFactory(WebSocketServerFactory):
...
我得到了sanic事件循环并将工厂设置为ChatFactory
async def after_server_start(app, loop):
factory = ChatFactory(u"ws://127.0.0.1:9000")
factory.protocol = ChatServerProtocol
loop.set_task_factory(factory)
上述代码失败:
Error: Bad Request
Traceback (most recent call last):
File "httptools/parser/parser.pyx", line 296, in httptools.parser.parser.cb_on_message_complete (httptools/parser/parser.c:4868)
File "/Users/XXX/Documents/Projects/sanic_env/lib/python3.6/site-packages/sanic/server.py", line 227, in on_message_complete
self.execute_request_handler()
File "/Users/XXX/Documents/Projects/sanic_env/lib/python3.6/site-packages/sanic/server.py", line 234, in execute_request_handler
self.stream_response))
File "uvloop/loop.pyx", line 1146, in uvloop.loop.Loop.create_task (uvloop/loop.c:24809)
TypeError: __call__() takes 1 positional argument but 3 were given
和问题:
答:我可以为高速公路使用sanic事件循环吗?
B:如果是,应该怎么做?
答案 0 :(得分:0)
嗯。这是一个复杂的问题要回答。现在回答:不确定。
如果你看一下autobahn-python它指定了它的twisted / asyncio,就没有提到uvloop。虽然我可以补充一下,但是如果你和我的一位同事在crossbar.io中讨论这个讨论,我认为应该可以为asyncio进行swopping uvloop。https://github.com/crossbario/autobahn-python/issues/925。
根据上面提到的问题925,你需要创建一个新的事件循环var来进入uvloop。
我自己没试过,所以希望它有所帮助。