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

Python多重处理:按值传递对象?

笪健
2023-03-14
问题内容

我一直在尝试以下方法:

from multiprocessing import Pool

def f(some_list):
    some_list.append(4)
    print 'Child process: new list = ' + str(some_list)
    return True

if __name__ == '__main__':

    my_list = [1, 2, 3]
    pool = Pool(processes=4)
    result = pool.apply_async(f, [my_list])
    result.get()

    print 'Parent process: new list = ' + str(my_list)

我得到的是:

Child process: new list = [1, 2, 3, 4]
Parent process: new list = [1, 2, 3]

因此,这意味着 my_list 是按值传递的,因为它没有突变。那么,是否将规则传递给另一个进程时确实按值传递规则呢?谢谢。


问题答案:

正如AndréLaszlo所说,该multiprocessing库需要对传递给multiprocessing.Pool方法的所有对象进行腌制,以将它们传递给工作进程。酸洗过程导致在工作进程中创建一个不同的对象,因此在工作进程中对该对象所做的更改不会影响父对象中的对象。在Linux上,对象有时会通过fork继承传递给子进程(例如multiprocessing.Process(target=func, args=(my_list,))),但是在这种情况下,您最终会在子进程中获得对象的写时复制版本,因此当您执行操作时,仍然会得到不同的副本尝试在任一过程中对其进行修改。

如果确实要在进程之间共享对象,则可以multiprocessing.Manager为此使用a

from multiprocessing import Pool, Manager

def f(some_list):
    some_list.append(4)
    print 'Child process: new list = ' + str(some_list)
    return True

if __name__ == '__main__':

    my_list = [1, 2, 3]
    m = Manager()
    my_shared_list = m.list(my_list)
    pool = Pool(processes=4)
    result = pool.apply_async(f, [my_shared_list])
    result.get()

    print 'Parent process: new list = ' + str(my_shared_list)

输出:

Child process: new list = [1, 2, 3, 4]
Parent process: new list = [1, 2, 3, 4]


 类似资料:
  • 问题内容: 当将对象作为参数传递时,JavaScript通过引用传递它们,这使得创建对象的本地副本变得困难。 将有和。 通过克隆可以解决这个问题。简单的例子: 不会或。 题 除了创建本地副本/克隆以外,还有没有更好的方法可以按值传递对象? 问题答案: 并不是的。 根据你的实际需要,一个 可能性 可能是集作为一个新的对象的原型。 因此,您添加到的任何属性都不会添加到中。使用与中的属性相同的属性名称添

  • 问题内容: 如果我将数据帧传递给函数并在函数内部对其进行修改,那么它是按值传递还是按引用传递? 我运行以下代码 函数调用后,的值不变。这是否意味着价值传递? 我也尝试了以下 事实证明,变化并没有。为什么会这样呢? 问题答案: 简短的答案是,Python始终会传递值,但每个Python变量实际上都是指向某个对象的指针,因此有时看起来像是传递引用。 在Python中,每个对象都是可变的或不可更改的。例

  • 我不明白为什么system.out.println(names)在不受方法concat函数影响的情况下输出Sam,而system.out.println(names)却输出Sam4作为方法append方法的结果。为什么StringBuilder受到影响而不是String?通常情况下,对对象的引用调用方法会影响调用方,所以我不明白为什么字符串结果保持不变。提前致谢

  • 问题内容: 我正在Ubuntu 14.04上使用Python 3.4进行开发。我试图做递归。在我调用之后,它挂在那里并且永远不会返回。 问题答案: 这是不可能的。所述对象本身不能安全进程之间被共享,所以相同的池不能在两者中使用和。即使您 可以 执行此操作,也很快会导致挂起,因为您的池仅限于并发工作程序。一旦开始递归地创建更多的工作人员,您最终将获得比工作人员更多的工作量,这将永远无法完成。正在运行

  • 本文向大家介绍JS是按值传递还是按引用传递,包括了JS是按值传递还是按引用传递的使用技巧和注意事项,需要的朋友参考一下 按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。   按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被

  • 问题内容: 我一直认为Java使用传递引用。 但是,我已经看到了几篇博客文章声称不是(博客文章说Java使用值传递)。 我不认为我能理解他们的区别。 有什么解释? 问题答案: Java总是按值传递。 不幸的是,我们根本不处理任何对象,而是处理称为引用的 对象句柄(当然是通过值传递)。选择的术语和语义很容易使许多初学者感到困惑。 它是这样的: 在上面的示例中仍将返回”Max”。值aDog内main未