当前位置: 首页 > 面试题库 >

python:在多个实例上并行调用方法

令狐跃
2023-03-14
问题内容

这个问题已经在这里有了答案

如何并行化一个简单的Python循环? (13个回答)

3年前关闭。

我试图在多个实例并行引用同一方法,其中实例引用同一对象。

很抱歉造成这种混淆。

具体来说,我想将以下for循环更改为并行执行:

for i in range(len(instances)):#instances is a list of instances
   instances[i].do_some_computation_over_a_dataset()

可能吗?

未来读者注意事项:

上面的代码不是迭代Python中实例集合的方法。这是一种以顺序(即非并行)方式进行迭代的方法:

for i in instances:
    i.do_some_computation_over_a_dataset()

问题答案:

好的,让我们一起做。首先是代码(multiprocessing
docs
):

In [1]: from multiprocessing import Process

In [2]: def f():
   ...:     print(1)
   ...:     for i in range(100):
   ...:         # do something
   ...:         pass
   ...:

In [3]: p1 = Process(target=f)

In [4]: p1.start()

1
In [5]: p2 = Process(target=f)

In [6]: p2.start()

1
In [7]: import time

In [8]: def f():
   ...:     for i in range(100):
   ...:         print(i)
   ...:         # do something
   ...:         time.sleep(1)
   ...:         pass
   ...:
In [9]: p1 = Process(target=f)
In [9]: p1 = Process(target=f)

In [10]: p1.start()

0
In [11]: p2 1
= Process(target=f)2
3
4
5
In [11]: p2 = Process(target=f)

In [12]: 6
p2.7
start8
In [12]: p2.start()

0
In [13]: 9

这是如何并行调用函数的示例。从In [10]: p1.start()你所看到的,因为程序P1并联运行时,我们运行程序P2的输出被搞乱。

使用Python脚本运行程序时,您要确保脚本仅在所有程序成功执行后才结束。你可以这样做

def multi_process(instance_params, *funcs):
   process = []
   for f in funcs:
       prog = Process(target=f, args=instance_params)
       prog.start()
       process.append(prog)
   for p in process:
       p.join()

multi_process(params, f, f)

由于GIL,Python没有C
++或Java之类的多线程支持。在这里阅读。尽管如果您的程序能够执行更多的I
/ O操作,然后执行CPU密集型任务,那么您可以使用多线程。为了执行CPU密集型任务,建议进行多处理。

@ytutow在评论中询问了 工作人员流程
之间的区别是什么。从Pymotw:

池类可用于管理固定数量的工人,以用于简单的情况,在这些情况下,可以分解要完成的工作并在工人之间独立分配。

收集作业的返回值并作为列表返回。

池参数包括进程数和启动任务进程时要运行的函数(每个子进程调用一次)。

您可以将Pool用作:

def your_instance_method(instance):
   instances.do_some_computation_over_a_dataset()

with Pool(3) as p:
    instances = [insatnce_1, instance_2, instance_3]
    print(p.map(your_instance_method, instances))

关于正确的工人数,一般建议使用2 * cpu_cores工人数。



 类似资料:
  • 要在实例上调用方法,您必须获取实例的引用并调用该方法。该示例说明了如何获取引用和调用方法,检查 API 以获取可用方法的列表。 // 3 ways of doing the same thing $('#jstree').jstree(true) .select_node('mn1'); $('#jstree') .jstree('select_node', 'mn2'); $.

  • 我正在使用Python(IPython 我有一个3000个唯一ID的数组,可以从API中提取数据,一次只能使用一个ID调用API。 我希望以某种方式同时拨打3组1000个电话,以加快速度。 最好的方法是什么? 提前感谢任何帮助!

  • 本文向大家介绍python实现合并多个list及合并多个django QuerySet的方法示例,包括了python实现合并多个list及合并多个django QuerySet的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现合并多个list及合并多个django QuerySet的方法。分享给大家供大家参考,具体如下: 在用python或者django写一些小工具

  • 通过前面的学习,类方法大体分为 3 类,分别是类方法、实例方法和静态方法,其中实例方法用的是最多的。我们知道,实例方法的调用方式其实有 2 种,既可以采用类对象调用,也可以直接通过类名调用。 通常情况下,我们习惯使用类对象调用类中的实例方法。但如果想用类调用实例方法,不能像如下这样: 运行上面代码,程序会报出如下错误: Traceback (most recent call last):   Fi

  • 我从几个不同的API获取数据。它们是Rest和肥皂网络服务。我有一个ID,我一个接一个地传递给每个API,并获得数据作为回报。但是每个API需要几秒钟才能返回结果,因此我创建的最终响应对象需要太多时间。 我的应用程序是Spring4REST服务。并行调用所有这些API的最佳方法是什么,以便将响应时间减少到尽可能少的程度。 谢谢

  • 本文向大家介绍python多进程并行代码实例,包括了python多进程并行代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了python多进程并行代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码: 效果图【未加锁,会发现数字1没出现,进程间资源抢夺导致】: 优化之后效果: 代码: 以上就是本文的全部内容,希望对大家的