python - sanic:如何异步转换 markdown 内容

标签 python markdown python-asyncio sanic

我有以下 Sanic 路线:

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 个请求。

由于没有 asyncio markdown 库,我想我会将转换卸载到一个单独的线程中以释放阻塞代码:

loop = asyncio.get_event_loop()
content = await loop.run_in_executor(ThreadPoolExecutor(), md.convert(content))

但是,这会引发回溯:

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 内使用事件循环?还有其他选项可以使转换非阻塞吗?

最佳答案

md.convert(content) 实际运行该函数。这:

content = await loop.run_in_executor(ThreadPoolExecutor(), md.convert(content))

与此相同:

content = await loop.run_in_executor(ThreadPoolExecutor(), "some HTML")

这显然是错误的。您不想运行该函数。您想要传递该函数;执行器将处理运行它。 signature of run_in_executor

coroutine AbstractEventLoop.run_in_executor(executor, func, *args)

所以用这个代替

content = await loop.run_in_executor(ThreadPoolExecutor(), md.convert, content)

关于python - sanic:如何异步转换 markdown 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45253341/

相关文章:

python - 语法错误: invalid syntax for a beginner

python - 将字符串和数字读入数组

docker - curl 命令参数上的YAML解析错误

sqlite - 在Flask应用程序中对查询的SQL使用markdown格式

Python 异步 : yield from wasn't used with future?

python - 如何在 python 中设计异步管道模式

Ubuntu 上的 Python Cron 作业

python - 如何从一行文本创建字典?

html - 为 Markdown 设计表定义语法

python - 存储事件后,异步事件等待函数不会继续