当前位置: 首页 > 知识库问答 >
问题:

python3.x - 如何让多进程调用同一个函数运行更快?

戚浩淼
2023-06-25

同时运行4个进程,这4个进程会调用同一个作用域在全局的函数(4个进程的代码片段有相同部分,有不同部分),这4个进程的运行速度是否会因此受到影响?
我是否需要先深拷贝这个全局函数4份,然后每个进程,传递一个同样函数的深拷贝(伪装成4个函数),这样做,整体的程序,运行会更快吧?
这样可以避免万一发生4个进程同时调用一个函数,起冲突?

下面有这样的伪代码表示我的基本意思:

def global_fun():
     do something
 
def p1_fun():
    for item in range(0,10000):
         global_fun()
     do something in p1

def p2_fun():
   for item in range(0,10000):
        global_fun()
    do something in p2
 
def p3_fun():
   for item in range(0,10000):
        global_fun()
    do something in p3
 
def p4_fun():
   for item in range(0,10000):
        global_fun()
    do something in p4
 
pool.apply_async(p1_fun)
pool.apply_async(p2_fun)
pool.apply_async(p3_fun)
pool.apply_async(p4_fun)

global_fun()​在四个进程中,会被调用很多次,需要深拷贝这个函数四次后,分别传入到apply_async中去吗?

共有1个答案

吴正祥
2023-06-25

并没有性能提升,你这样做反而会增加一个程序的内存占用,按照现有的计算机程序组织逻辑来说,程序的代码会放在一个可读可执行的内存段中,所以保存多份只读的数据是毫无意义的应为他们没有被重写的风险,这也是immutable带来的好处往往只用保存数据的一份副本即可,所以再对于fork出来的多个进程而言他们他们的代码区域的虚拟内存空间往往会被映射到同一份物理内存,你复制四份同样的代码反而让程序代码大小增大的四倍,需要载入四份同样的代码到内存中

 类似资料:
  • 我自己写了一个多进程下载网络大文件的程序:基本思路是多进程分块下载完后,再拼接文件。 这个url的大文件被分割成20个部分,开启了4个进程下载。 测试运行: python3 mpdown.py #速度比单进程快50%以上。 现在我有点不满意这个多进程下载,拼接文件(merge)是在全部下载完成后,再拼接,我想这个拼接动作也修改成多进程并行的,边下载边拼接。 由于下载是多进程的,各进程存在一定的竞争

  • 问题内容: 我正在开发Django应用。我有一个API端点,如果需要,它必须执行必须重复几次的功能(直到满足特定条件为止)。我现在如何处理- 虽然我知道这是一种可怕的方法,并且我不应该阻塞2秒钟,但是我不知道该如何解决。 等待4秒后,此方法起作用。但是我想要使循环在后台运行并在some_fn返回True时停止的东西。(此外,可以肯定some_fn将返回True) 编辑- 阅读Oz123的响应给了我

  • 问题内容: 我是Tor的新手,我觉得应该考虑多个Tor。我在这里提到的多个tor不仅是多个实例,而且每个实例都使用不同的代理端口,就像在这里所做的一样 http://www.howtoforge.com/ultimate-security-proxy-with- tor ) 我正在尝试开始使用4 Tors。但是,本教程仅适用于Arch Linux,我使用的是无头EC2 ubuntu 64位。遍历A

  • 问题内容: 我有这个功能,当我点击标签时,我想调用两个功能,一个来自父组件的props的处理程序功能,还有这个功能 如何调用这两个函数?这是父组件的处理函数 问题答案: 这样写: 或创建一个函数,将其用作单击处理程序。在该函数内部调用其他两个函数,如下所示: 请参阅使用箭头功能的两种方法: 1-简洁的机身: 2块体 在内部的程序块主体(函数的主体)中,我们可以执行任意数量的任务。 像这样:

  • 问题内容: 是否有一种简短的方法可以在Python中连续两次或更多次调用函数?例如: 也许像: 问题答案: 我会: 的是其值为你不关心的变量约定。 您可能还会看到有人写: 但是,这样做会稍微贵一些,因为它会创建一个包含每次调用(即使是)的返回值的列表,然后将结果列表丢弃。我不建议使用,除非你 正在 使用的返回值的列表。

  • 问题内容: 在我的NodeJS代码中,我需要进行2或3个API调用,每个调用都会返回一些数据。在完成所有API调用之后,我想将所有数据收集到单个JSON对象中以发送到前端。 我知道如何使用API​​回调(下一个调用将在上一个调用的回调中发生)执行此操作,但这会很慢: 我知道您也可以通过promise做一些类似的事情,但我认为相同的概念适用于下一个调用要等到当前调用完成后才能执行的情况。 有没有一种