首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sanic:如何异步转换减价内容

sanic:如何异步转换减价内容
EN

Stack Overflow用户
提问于 2017-07-22 10:14:20
回答 1查看 390关注 0票数 1

我有以下卫生路线:

代码语言:javascript
复制
md = Markdown()

@app.route('/md_file')
async def md_file(request):
    async with aiofiles.open('./file.md')) as f:
        content = await f.read()

    content = md.convert(content)
    return html(content)

这很好,但是转换需要很长的时间,并且阻塞端点。当进行基准测试时,端点只能每秒处理4个请求。

由于没有异步标记库,我想我应该将转换卸载到一个单独的线程中,以释放阻塞代码:

代码语言:javascript
复制
loop = asyncio.get_event_loop()
content = await loop.run_in_executor(ThreadPoolExecutor(), md.convert(content))

但是,这会引发一个跟踪:

代码语言:javascript
复制
2017-07-22 12:02:24 - (sanic)[ERROR]: Traceback (most recent call last):
  File "/home/user/app/venv/lib64/python3.5/site-packages/sanic/app.py", line 471, in handle_request
    response = await response
  File "app.py", line 127, in blog_posts
    content = await loop.run_in_executor(ThreadPoolExecutor(), md.convert(content))
  File "uvloop/future.pyx", line 241, in __await__ (uvloop/loop.c:110786)
  File "uvloop/future.pyx", line 432, in uvloop.loop.BaseTask._fast_wakeup (uvloop/loop.c:113980)
  File "uvloop/future.pyx", line 101, in uvloop.loop.BaseFuture._result_impl (uvloop/loop.c:108900)
  File "/opt/rh/rh-python35/root/usr/lib64/python3.5/concurrent/futures/thread.py", line 55, in run
    result = self.fn(*self.args, **self.kwargs)
TypeError: 'str' object is not callable

不可能在Sanic内部使用事件循环吗?是否有任何其他选项使转换非阻塞?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-22 11:43:49

md.convert(content)实际上运行这个函数。这是:

代码语言:javascript
复制
content = await loop.run_in_executor(ThreadPoolExecutor(), md.convert(content))

与此相同:

代码语言:javascript
复制
content = await loop.run_in_executor(ThreadPoolExecutor(), "some HTML")

这显然是错误的。你不想运行这个函数。您希望传递函数;执行器将处理运行它。run_in_executor

coroutine AbstractEventLoop.run_in_executor(执行者,函数,*args)

所以用这个代替

代码语言:javascript
复制
content = await loop.run_in_executor(ThreadPoolExecutor(), md.convert, content)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45253341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档