【发布时间】:2014-12-12 05:25:12
【问题描述】:
我所有的代码都是通过 say() 将日志写入 sys.stderr 和错误重定向。在多线程服务器中,我希望每个线程都写入单独的日志文件。我可以在不重写线程使用的所有代码的情况下完成此操作吗?
from threading import Thread
from time import sleep
def say(*args):
print(*args, file=sys.stderr)
def worker(num):
for _ in range(5):
say("worker", num, "working")
sleep(.1)
for num in range(4):
Thread(target=worker, args=(num,)).start()
输出混入,目标是将其重定向到每个线程的不同日志文件:
worker 0 working
worker 1 working
worker 2 working
worker 3 working
worker 0 working
worker 1 working
worker 3 working
worker 2 working
. . .
我的理解是,如果我尝试将 stderr 重定向到线程内的文件,则重定向将由所有线程共享:
def worker(num):
sys.stderr = open('worker{}.log'.format(num), 'w')
for _ in range(5):
say("worker", num, "working")
结果如预期:
$ cat worker3.log
worker 1 working
worker 1 working
worker 1 working
worker 3 working
worker 3 working
worker 3 working
worker 3 working
worker 3 working
更新
@Amber,我已经有了唯一标识符,可以用它作为线程名:
def say(*args, end='\n'):
print(currentThread().getName(), *args, file=sys.stderr, end=end)
sys.stderr.flush()
t_worker = Thread(name=str(num), target=worker, args=(num,))
我不能为每个线程动态选择日志文件,因为 say() 是全局的——需要在这个全局日志文件存储上放置一个信号量,或者将一个日志对象传递给每个单独的函数记录进度。
【问题讨论】:
-
@Amber,我已经有一个唯一标识,可以用它作为线程名:
标签: python multithreading python-3.x python-multithreading