我有一个使用多个 Flask socketio 后台任务的应用程序。每个异步任务执行不同的操作,并在不同的文件中定义。我不想只打印所有内容,而是开始通过 writeToConsole 包装函数路由调试信息。它将首先打印当前时间戳、调用该函数的任务的名称或 ID,然后打印消息。最终,我会将函数写入日志文件,但现在这已经足够了。
如果这些任务是使用线程模块完成的,我只需调用 threading.current_thread().name 即可获得每个线程的标识符。但是,在这里使用它只会返回“MainThread”。这是我当前应用程序的示例,以及我想使用 writeToConsole 执行的操作:
from flask import Flask
from flask_socketio import SocketIO
app = Flask(__name__)
socketio= SocketIO(app)
socketio.start_background_task( myTask1 )
socketio.start_background_task( myTask2 )
socketio.start_background_task( myTask3 )
def myTask1():
while True:
writeToConsole("Foo")
socketio.sleep( 1 )
def myTask2():
while True:
writeToConsole("Bar")
socketio.sleep( 2 )
def myTask3():
while True:
writeToConsole("Baz")
socketio.sleep( 3 )
def writeToConsole( msg ):
name = ???
time_stamp = "12:34:56"
print(f"{time_stamp} - Process {name} says: {msg}")
有人可以给我更多信息吗?我不一定关心标识符是否像 ProcessName 一样“干净”,或者只是一个数字 ID——只要它对于每个任务都是唯一的,这对我来说就很好。我在线浏览了flask_socketio.SocketIO文档,但我似乎找不到任何可以帮助我的东西。
最坏的情况,我可以向 writeToConsole 添加一个新的参数,然后向它提供一些我手动想出的唯一标识符,但这让我觉得不优雅而且有点笨拙,所以如果有更好的方法,我宁愿不这样做。
这实际上取决于您使用的并发库。如果您使用标准线程,那么您可以获得一个唯一的线程标识符,如下所示:
import threading
print(id(threading.get_current()))
如果您使用基于 greenlet 的并发(gevent 或 eventlet),那么您可以这样做:
import greenlet
print(id(greenlet.getcurrent()))
使用 gevent 或 eventlet 时,您还可以选择“猴子修补”标准库,使其成为非阻塞的。如果您进行猴子修补,那么上面基于
threading
库的示例还将为您提供每个任务的唯一标识符。