Python中的线程启动钩子

时间:2013-01-14 14:54:36

标签: python multithreading

有没有办法在Python(2.7)中启动新线程时运行任意方法?我的目标是使用setproctitle为每个衍生线程设置合适的标题。

2 个答案:

答案 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