有没有办法获取调用函数的socketio后台任务的“名称”?

问题描述 投票:0回答:1

我有一个使用多个 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 添加一个新的参数,然后向它提供一些我手动想出的唯一标识符,但这让我觉得不优雅而且有点笨拙,所以如果有更好的方法,我宁愿不这样做。

python flask flask-socketio
1个回答
0
投票

这实际上取决于您使用的并发库。如果您使用标准线程,那么您可以获得一个唯一的线程标识符,如下所示:

import threading
print(id(threading.get_current()))

如果您使用基于 greenlet 的并发(gevent 或 eventlet),那么您可以这样做:

import greenlet
print(id(greenlet.getcurrent()))

使用 gevent 或 eventlet 时,您还可以选择“猴子修补”标准库,使其成为非阻塞的。如果您进行猴子修补,那么上面基于

threading
库的示例还将为您提供每个任务的唯一标识符。

© www.soinside.com 2019 - 2024. All rights reserved.