多进程运行含有任意参数的函数、为什么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

  • 24
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Billie使劲学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值