如何编写多线程函数来同时处理不同的任务?

2024-04-20 12:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在python中定义一个do_in_parallel函数,它将接收带有参数的函数,为每个函数创建一个线程并并行执行它们。该功能的工作原理如下:

do_in_parallel(_sleep(3), _sleep(8), _sleep(3))

但是,我很难定义do_in_parallel函数来获取每个函数都有多个参数的多个函数,下面是我的尝试:

from time import sleep
import threading

def do_in_parallel(*kwargs):

    tasks = []

    for func in kwargs.keys():
        t = threading.Thread(target=func, args=(arg for arg in kwargs[func]))
        t.start()
        tasks.append(t)

    for task in tasks:        
        task.join()

def _sleep(n):
    sleep(n)
    print('slept', n)

按此方式使用,并得到以下错误:

do_in_parallel(_sleep=3, _sleep=8, _sleep=3)

>> do_in_parallel(sleepX=3, sleepX=8, sleepX=3)
                            ^
>> SyntaxError: keyword argument repeated

有人能解释一下我需要在函数中更改什么,以便它可以接受多个函数参数吗

do_in_parallel(_sleep(3), _sleep(8), maybe_do_something(else, and_else))

Tags: 函数inimportfor参数定义paralleldef
1条回答
网友
1楼 · 发布于 2024-04-20 12:23:14

do_in_parallel(_sleep(3), _sleep(8), maybe_do_something(else, and_else))

这个调用结构无论如何都不起作用,因为您正在将目标函数的结果传递给do_in_parallel(您已经在调用\u sleep等)。你知道吗

相反,您需要做的是将任务捆绑起来,并将这些任务传递给处理函数。这里的任务是一个元组,包含要调用的目标函数和参数元组task = (_sleep, (n,))。你知道吗

我建议您使用线程池和apply_async方法来处理单独的任务。你知道吗

from time import sleep
from multiprocessing.dummy import Pool  # .dummy.Pool is a ThreadPool


def _sleep(n):
    sleep(n)
    result = f'slept {n}'
    print(result)
    return result


def _add(a, b):
    result = a + b
    print(result)
    return result


def do_threaded(tasks):
    with Pool(len(tasks)) as pool:
        results = [pool.apply_async(*t) for t in tasks]
        results = [res.get() for res in results]
    return results


if __name__ == '__main__':

    tasks = [(_sleep, (i,)) for i in [3, 8, 3]]
    # [(<function _sleep at 0x7f035f844ea0>, (3,)),
    #  (<function _sleep at 0x7f035f844ea0>, (8,)),
    #  (<function _sleep at 0x7f035f844ea0>, (3,))]
    tasks += [(_add, (a, b)) for a, b in zip(range(0, 3), range(10, 13))]

    print(do_threaded(tasks))

输出:

10
12
14
slept 3
slept 3
slept 8
['slept 3', 'slept 8', 'slept 3', 10, 12, 14]

Process finished with exit code 0

相关问题 更多 >