Flask中如何嵌套启动子线程?
如果你在Flask中启动过子线程,然后在子线程中读写过g
对象或者尝试从request
对象中读取url参数,那么,你肯定对下面这个报错不陌生:RuntimeError: Working outside of request context.
.
例如下面这段Flask代码:
1 | import threading |
请求/start_thread
接口就会报错,如下图所示:
如果你在网上搜索flask thread RuntimeError: Working outside of request context.
,那么你可能会看到官方文档或者StackOverFlow上面提供了一个装饰器@copy_current_request_context
。如下图所示:
照着它这样写,确实能解决问题,如下图所示:
但无论是官网还是StackOverFlow,它的例子都非常简单。但是我们知道,启动线程有很多种方法,例如:
1 | # 方法一,启动简单线程 |
网上的方法只能解决第一种写法的问题。如果想使用方法2和方法3启动子线程,代码应该怎么写呢?如果在子线程中又启动子线程,再用一次@copy_current_request_context
还行吗?
相信我,你在网上搜索一下午,只有两种结果:一是找不到答案,二是找到的答案是晚于2023年1月14日的,因为是别人看了我这篇文章以后,再写的。