有没有办法在 Python(2.7)中启动新线程时运行任意方法?我的目标是使用setproctitle为每个生成的线程设置适当的标题。
问问题
923 次
2 回答
5
只需从 threading.Thread 继承并使用此类而不是 Thread - 只要您可以控制线程。
import threading
class MyThread(threading.Thread):
def __init__(self, callable, *args, **kwargs):
super(MyThread, self).__init__(*args, **kwargs)
self._call_on_start = callable
def start(self):
self._call_on_start()
super(MyThread, self).start()
就像一个粗略的草图。
编辑
根据评论,需要将新行为“注入”到现有应用程序中。假设您有一个脚本,它本身可以导入其他库。这些库使用threading
模块:
在导入任何其他模块之前,首先执行此;
import threading
import time
class MyThread(threading.Thread):
_call_on_start = None
def __init__(self, callable_ = None, *args, **kwargs):
super(MyThread, self).__init__(*args, **kwargs)
if callable_ is not None:
self._call_on_start = callable_
def start(self):
if self._call_on_start is not None:
self._call_on_start
super(MyThread, self).start()
def set_thread_title():
print "Set thread title"
MyThread._call_on_start = set_thread_title()
threading.Thread = MyThread
def calculate_something():
time.sleep(5)
print sum(range(1000))
t = threading.Thread(target = calculate_something)
t.start()
time.sleep(2)
t.join()
由于后续导入仅在 中进行查找sys.modules
,因此所有其他使用它的库现在应该使用我们的新类。我认为这是一种 hack,它可能会产生奇怪的副作用。但至少值得一试。
请注意:threading.Thread
不是在 python 中实现并发的唯一方法,还有其他选项,如multiprocessing
etc.. 这些在这里不受影响。
编辑 2
我刚刚看了你引用的库,它都是关于进程的,而不是线程!所以,只要做一个:%s/threading/multiprocessing/g
and:%s/Thread/Process/g
就可以了。
于 2013-01-14T14:58:48.863 回答
0
使用threading.setprofile
. 你给它你的回调,Python 会在每次新线程启动时调用它。
文档在这里。
于 2015-03-13T18:11:16.733 回答