有没有办法在Python(2.7)中启动新线程时运行任意方法?我的目标是使用setproctitle为每个衍生线程设置合适的标题。
答案 0 :(得分: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
中进行查找,因此使用它的所有其他库现在应该使用我们的新类。我认为这是一个黑客,它可能有奇怪的副作用。但至少值得一试。
请注意:threading.Thread
不是在python中实现并发的唯一方法,还有其他选项,如multiprocessing
等。这些将不受影响。
编辑2
我只是看看你引用的库,它是关于进程的,而不是Threads!所以,只需做一个:%s/threading/multiprocessing/g
和:%s/Thread/Process/g
,事情应该没问题。
答案 1 :(得分:0)
使用threading.setprofile
。你给它回调,每次新线程启动时Python都会调用它。
文档here。