Python SocketIO中的后台任务

Python SocketIO中的后台任务,python,multithreading,flask,flask-socketio,Python,Multithreading,Flask,Flask Socketio,我有一个非常直截了当的问题,但我还没有找到一个非常直截了当的答案:什么时候应该使用start_background_task()而不是“正常”启动Python线程?Flask SocketIO文档说明: 此函数返回与Python标准库中的Thread类兼容的对象。此函数已调用此对象上的start()方法 它没有说明是否有必要根据线程化模块过度初始化和启动线程。存在启动后台任务()的原因是,根据您使用的web服务器,线程模型会发生变化。例如,如果您使用的是eventlet或gevent,那么后台任

我有一个非常直截了当的问题,但我还没有找到一个非常直截了当的答案:什么时候应该使用start_background_task()而不是“正常”启动Python线程?Flask SocketIO文档说明:

此函数返回与Python标准库中的Thread类兼容的对象。此函数已调用此对象上的start()方法


它没有说明是否有必要根据
线程化
模块过度初始化和启动线程。

存在
启动后台任务()
的原因是,根据您使用的web服务器,线程模型会发生变化。例如,如果您使用的是eventlet或gevent,那么后台任务需要作为greenlet启动,而不是作为
线程
实例启动


如果使用
start\u background\u task(),或者,当我要运行执行诸如emit之类操作的后台任务时,我不应该使用线程实例?换句话说,使用线程实例在与客户机-服务器连接完全无关的服务器上执行某种类型的I/O是否安全?通常,eventlet应用程序根本不使用常规线程,因为要使普通线程与eventlet服务器进行交互而不阻塞它是非常困难的。因此,您是否建议小心导入哪些模块,以防它们也使用线程实例?在我的例子中,我想知道的是,我有一个应用程序在本地运行,它可以将数据保存到文本块中,而保存操作发生在线程实例上。我没有注意到任何问题,我已经运行了一段时间了。我也从不将该线程连接回主线程。我不确定这是否有区别。如果这是一个问题,我是否必须将SocketIO对象传递给我创建的任何其他自定义模块,如果我希望该模块运行后台任务?如果您的线程只是自己做一些工作,并且从不与应用程序的其余部分通信,我想这不会导致问题。对于使用启动线程的代码的情况,eventlet提供了monkey补丁选项,该选项使
Thread
类使用greenlet。看,我提到的通信是当这个后台线程需要以任何方式与eventlet线程交互时。如果线程是独立的,那么它应该是好的。如果它需要协调或向eventlet端传递数据,那么您可能会遇到问题。