1

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

4

2 回答 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 中实现并发的唯一方法,还有其他选项,如multiprocessingetc.. 这些在这里不受影响。

编辑 2 我刚刚看了你引用的库,它都是关于进程的,而不是线程!所以,只要做一个:%s/threading/multiprocessing/gand:%s/Thread/Process/g就可以了。

于 2013-01-14T14:58:48.863 回答
0

使用threading.setprofile. 你给它你的回调,Python 会在每次新线程启动时调用它。

文档在这里

于 2015-03-13T18:11:16.733 回答