多进程运行含有任意参数的函数、为什么multiprosessing会进行多次初始化

这篇具有很好参考价值的文章主要介绍了多进程运行含有任意参数的函数、为什么multiprosessing会进行多次初始化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

多进程运行含有任意个参数的函数,以map_async为例

为什么multiprocessing 的了进程会多次初始化?


多进程运行含有任意个参数的函数,以map_async为例

        使用偏函数:偏函数有点像数学中的偏导数,可以让我们只关注其中的某一个变量而不考虑其他变量的影响。

如以下代码中,我们要将set_seq、tokenizer和model作为变量传入“Seq_to_vec”函数中。particial函数中,“Seq_to_vec”是一个函数,tokenizer和model是不变的量,“map_async”中particial_func为偏函数,set_seq为可迭代对象。

#########################
####### 多进程
#########################
particial_func = partial(Seq_to_vec,tokenizer = tokenizer, model = model)
torch.multiprocessing.set_start_method('spawn', force=True)
pool = multiprocessing.Pool(2)
print(f'~~~~~~~~~~~~~~~~~~')
seq_embeddings_list = pool.map_async(particial_func, seq_set).get()
seq_embeddings = {}

a = time.time()
for i in seq_embeddings_list:
    seq_embeddings.update(i)
b = time.time()
print(f'处理的时间{b-a}')
print(f'----------------')
pool.close()
pool.join()

 

为什么multiprocessing 的了进程会多次初始化?

        在使用multiprocessing模块创建子进程时,子进程在初始化的过程中确实会执行次。这是因为子进程是通过fork或spawn 的方式创建的,而fork 会复制父进程的有资源,包括代码段、数据段、堆栈等。因此,子进程会执行一次父进程的初始化代码。
        在某些情况下,你可能会看到子进程多次初始化的现象。这可能是因为在某些情况下主模块 (包含你的代码的那个文件)被多次导入。当子进程启动时,它会执行主模块的代码,如果主模块中有全局变量、函数定义等,这些代码会被重新执行。
        为了避免多次初始化,可以在主程序中添加如下的保护代码:

if __name__ == '__main__':

        这样的话,当子进程启动时,它会检查"__name__"变量,确保只有在主程序中才执行相关的初始化代码。这是因为在 Windows 上,每个子进程都会从头执行一次脚本,而在类 Unix 系统上,它们通过 fork 创建,然后从父进程中继承代码和数据段
        使用这个保护条件可以确保在子进程中只执行主程序的初始化代码,而不是执行整个脚本。这通常能够解决多次初始化的问题。

参考

Python:多进程运行含有任意个参数的函数

多进程multiprocessing——apply、map文章来源地址https://www.toymoban.com/news/detail-771145.html

到了这里,关于多进程运行含有任意参数的函数、为什么multiprosessing会进行多次初始化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux操作系统】编译过程中遇到的问题-为什么加-c?执行文件提示无法执行二进制文件?main函数参数argc和*argv[]的作用和理解?

    在使用GCC编译器进行程序开发时,我们经常会遇到一些编译过程中的问题, 比如为什么要加上\\\"-c\\\"选项,以及为什么生成的可执行文件无法执行等问题。 本篇博客将详细介绍这些问题,并给出相应的代码和解释,帮助读者更好地理解GCC编译过程中的\\\"-c\\\"选项和main函数的参数a

    2024年02月12日
    浏览(44)
  • 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...

    🌸作者简介: 花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。 🌸 专栏简介:本文收录于 Linux从入门到精通 ,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

    2024年02月05日
    浏览(32)
  • 进程切换的开销为什么比线程更大

    进程切换的开销通常比线程更大,这是因为进程是操作系统中的基本执行单元,而线程是在进程内部的执行单元。 主要原因: 上下文切换的开销: 进程切换需要保存和恢复更多的上下文信息。上下文信息包括进程的程序计数器、寄存器状态、内存映射、I/O 状态等,这些信息

    2024年01月18日
    浏览(27)
  • 为什么在容器中 1 号进程挂不上 arthas?

    最近在容器环境中,发现在 Java 进程是 1 号进程的情况下,无法使用 arthas。 提示 AttachNotSupportedException: Unable to get pid of LinuxThreads manager thread。具体操作和报错如下: 之前也遇到过,总是调整了下镜像,让 Java 进程不是 1 号进程就可以了。但这个不是长久之计,还是要抽时间

    2024年02月05日
    浏览(23)
  • 为什么使用线程池?解释下线程池参数?

    (1)降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗。 (2)提高响应速度:任务来了,直接有线程可用可执行,而不是线创建线程再执行。 (3)提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。 (1)corePoolSize:代表核心线程数,也

    2024年02月16日
    浏览(29)
  • 为什么C语言运行效率高

    C语言是一种高效的编程语言,因为它具有多种优点,使其成为一种非常适合进行系统级编程的语言。在本文中,我将详细解释C语言之所以高效的原因,并且探讨一些C语言程序员可以采取的最佳实践。 C语言是一种低级别编程语言,它允许程序员直接访问内存。这意味着程序

    2023年04月24日
    浏览(28)
  • 『Linux从入门到精通』第 ⑭ 期 - 僵尸进程?孤儿进程?为什么他有如此惨烈的身世...

    🌸作者简介: 花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。 🌸 专栏简介:本文收录于 Linux从入门到精通 ,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

    2024年02月16日
    浏览(34)
  • 为什么电脑运行越来越慢?解决方法又是什么呢?

    如果您经常使用电脑,肯定遇到过这种情况:对于新购买或者新安装了操作系统的电脑,它可以很顺畅地运行,速度也很快,但随着使用时间的增长,它的整体性能不断下降,速度越来越慢。 发生这种情况,除了电脑的使用年限过长、确实应该被淘汰以外,很大可能是“操作

    2024年02月08日
    浏览(44)
  • 06 为什么需要多线程;多线程的优缺点;程序 进程 线程之间的关系;进程和线程之间的区别

    CPU、内存、IO之间的性能差异巨大 多核心CPU的发展 线程的本质是增加一个可以执行代码工人 多线程的优点 多个执行流,并行执行。(多个工人,干不一样的活) 多线程的缺点 上下文切换慢,切换上下文典型值1us vs 0.3ns/cycle CPU在执行A任务(A没有执行完)时,切换到任务B,需

    2024年02月14日
    浏览(29)
  • 为什么axios会有params和data两个参数

    不知道大家有没有过这种感觉,突然一个问题百思不得其解,然后突然有一天就明白了。然后就感觉这个问题原来这么简单,本来想记录下来,但是又感觉这么简单的问题记录下来没啥意义。但是回过头来想一想,这个问题之前其实困扰了你很长时间。感觉还是记录一下比较

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包