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

2023-11-29

我想定义一个do_in_parallelpython 中的函数将接受带参数的函数,为每个函数创建一个线程并并行执行它们。该函数应该像这样工作:

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))

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

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

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

我建议你使用 ThreadPool 和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))

Output:

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

Process finished with exit code 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 将 android studio 项目与 Firebase 集成以实现 google 登录功能时出现依赖错误

    我正在 Kotlin 中开发一个应用程序 但不断收到错误 无法解析 firebase auth 15 0 0 当尝试同步 gradle 时 我正在尝试实现谷歌登录功能 apply plugin com android application
  • PHP生成文件并提示另存为

    我有一个用于生成 csv 文件然后下载的脚本 但我需要为用户提供 另存为 对话框 因为我想要快速替换旧文件 一个简单的例子 我下载文件 myFile csv 然后编辑数据并再次下载以进行刷新 但我需要替换该文件 浏览器将其下载为 myFil
  • 如何将 Django 查询集转换为列表?

    我有以下内容 answers Answer objects filter id in answer id for answer in answer set answers all 然后后来 for i in range len answer
  • 用retrofit-gson解析JSON?

    我正在尝试使用 Retrofit 来解析 json 数据 但没有收到数据来帮助我解析数据 以下是我创建的构建器和界面 public class fetchdata private static UserFetchData userdataf
  • 在 CodeIgniter 中创建主模板

    我遇到了一个非常基本的问题 问题是我想要一个主模板 在其中我可以调用页眉 正文和页脚 我无法在标头中发送标题和 css 以及如何发送多个 css 文件 我正在做这样的事情 这是控制器中的代码 data title Login To WePO
  • 如何从左向右移动/滑动图像

    我想从左向右滑动或移动图像 例如 http rajeevkumarsingh wix com pramtechnology 读取移动的五边形框 Ok 我尝试了一下但没能做到 我使用的代码如下
  • 使用 RVM 安装后,Ruby 1.9.2 不断恢复到 1.8.7

    我安装了 Ruby 1 9 2 我用了rvm use 1 9 2然后当我输入时ruby v它说1 9 2 然后 当我退出终端并重新打开它时 它再次显示 1 8 7 我究竟做错了什么 您的默认 ruby 很可能未设置为 ruby 1 9 2
  • 如何进行货物保存分析?

    我怎样才能把货物运到save analysis 我知道我可以这样做rustc通过致电 rustc Zsave snalysis
  • Matlab,如何调整图形上的轴值(科学记数法-精度不够)[重复]

    这个问题在这里已经有答案了 可能的重复 抑制数字刻度中的指数格式 对于我的图中的每个刻度线 Matlab 将我的轴标记输出为 5 777 x10 6 是否有可能让 matlab 输出实际的十进制数字而不是科学记数法 以便刻度线实际上是不同的
  • 读取文本文件并显示在表 vbscript 中

    我有一个具有以下结构的文本文件 C Users abc Desktop New Folder sample txt AccountName gt AbcPos AccountName gt dblLayer queryAccount gt
  • 在更新插入时跳过空值

    我正在使用 pg promise 来处理我的 Postgres 查询 但在找到以下查询的解决方案时遇到了麻烦 我正在尝试创建一种方法来一次批量插入多行 这是我的代码 massUpsert orgId entities gt db tx t
  • 如何在不重新启动的情况下关闭DEP(数据执行保护)?

    我正在编写一个测试网页 它调用 DLL 文件中的函数 但是每次我使用IE或FF打开它之前我必须禁用DEP 数据执行保护 否则脚本无法执行 当前禁用 DEP 的方法需要重新启动 但我不想重新启动 基本上 我正在寻找一种无需重新启动即可关闭 D
  • Google Cardboard Unity 5 没有立体视觉

    我的 Cardboard 应用程序在设备上没有立体效果 但它在编辑器中有效 这就是它在编辑器中的样子 https i stack imgur com sN14x png 这是它在设备上的样子https i stack imgur com 7
  • Pod 在 Kubernetes 中启动但不工作

    创建了具有 3 个 Pod 的 Kubernetes 集群部署 并且全部运行良好 但是当尝试运行它们时无法做到这一点 尝试在描述部分中执行卷曲 Pod 的 Ip 内部 我可以看到此错误 MountVolume SetUp failed fo
  • 自动执行eclipse插件

    我尝试创建一个 Eclipse 插件 当 Eclipse 工作台关闭时 它会删除一些文件 我从Hello World command插件项目并添加了IWorkbenchListener就像本主题中提到的Eclipse 关闭钩子能够停止终止
  • django 对 MongoDB 的内置支持

    我正在尝试查找官方 django 是否支持任何 noSQL DBMS 尤其是 MongoDB 的信息 我找到了一个Django 1 3 的分支 the Django nonrel 官方 django 的一个分支 和其他一些不太可靠的项目 根
  • 填充xaml矩形倍数solidcolorbrush

    xaml中这种类型的填充矩形可以吗 我不想使用渐变来填充矩形 因为每个部分的图像使用不同的纯色画笔 Thanks 尝试这个
  • std::string 构造函数中的内存分配/堆损坏

    我在内存分配方面再次遇到了一些麻烦 但我不明白为什么 当我在调试模式下运行程序时 我收到以下错误消息 我尝试尽可能准确地翻译它 Windows 已触发 LogoColorDetector exe 中的断点 这可能是由堆损坏引起的 这表明 L
  • 代理验证失败错误

    我正在尝试通过 FTP 站点代理访问 FTP 服务器以绕过防火墙it sauronsoftware ftp4j FTPClient我知道我的用户名 密码是正确的 因为我可以使用 FileZilla 进行连接 我尝试使用Authenticat
  • 如何编写多线程函数来同时处理不同的任务?

    我想定义一个do in parallelpython 中的函数将接受带参数的函数 为每个函数创建一个线程并并行执行它们 该函数应该像这样工作 do in parallel sleep 3 sleep 8 sleep 3 然而我很难定义do