1

我正在寻找一种方法来简化我的线程代码。

我的代码中有很多地方可以执行以下操作:

for arg in array:
   t=Thread(lambda:myFunction(arg))
   t.start()

即在线程中运行相同的函数,每次针对不同的参数。

这当然是真实代码的简化版本,通常for循环内的代码长约 10-20 行,不能像myFunction上面的例子那样使用一个辅助函数来简化(如果是这种情况,我可以只使用线程池)。

此外,这种情况在我的代码中非常非常常见,因此我认为有很多行是多余的。如果我不需要处理所有这些样板代码,而是能够执行以下操作,那将对我有很大帮助:

for arg in array:
      with threaded():
          myFunction(arg)

即以某种方式threaded()获取其中的每一行代码并在单独的线程中运行它。

我知道在这种情况下不应该使用上下文管理器,这可能是一个坏主意,并且需要一个丑陋的 hack,但尽管如此 - 可以做到吗,怎么做?

4

4 回答 4

1

这个怎么样:

for arg in array:
    def _thread():
        # code here
        print arg

    t = Thread(_thread)
    t.start()

此外,使用装饰器,您可以对其进行一些修饰:

def spawn_thread(func):
    t = Thread(func)
    t.start()
    return t

for arg in array:
    @spawn_thread
    def _thread():
        # code here
        print arg
于 2010-06-26T16:58:32.587 回答
0

线程池会在这里帮助你吗?存在许多 Python 实现,例如这个.


PS:仍然有兴趣知道您的确切用例是什么

于 2010-06-26T12:45:21.190 回答
0

你想要的是一种“上下文线程池”。

看看这个模块中的 ThreadPool 类,它的使用方式与您给出的方式相似。使用将是这样的:

with ThreadPool() as pool:
    for arg in array:
        pool.add_thread(target=myFunction, args=[arg])

给 ThreadPool 的任何任务中的失败都会标记错误,并执行标准的错误回溯处理。

于 2010-06-26T12:48:05.880 回答
0

我认为你过于复杂了。这是我使用的“模式”:

# util.py
def start_thread(func, *args):
    thread = threading.Thread(target=func, args=args)
    thread.setDaemon(True)
    thread.start()
    return thread

# in another module
import util
...
for arg in array:
    util.start_thread(myFunction, arg)

我不认为必须创建有什么大不了的myFunction。您甚至可以定义与启动它的函数内联的函数。

def do_stuff():
    def thread_main(arg):
        print "I'm a new thread with arg=%s" % arg
    for arg in array:
        util.start_thread(thread_main, arg)

如果您要创建大量线程,那么线程池肯定更有意义。Queue您可以使用和threading模块轻松制作自己的。基本上创建一个jobs队列,创建N工作线程,给每个线程一个指向队列的“指针”,让它们从队列中提取作业并处理它们。

于 2010-06-26T14:07:04.507 回答