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

在python多处理中修改对象

微生运浩
2023-03-14
问题内容

我有很多自定义对象,需要对其执行独立(可并行化)的任务,包括修改对象参数。我试过同时使用Manager()。dict和’sharedmem’ory,但都没有用。例如:

import numpy as np
import multiprocessing as mp
import sharedmem as shm


class Tester:

    num = 0.0
    name = 'none'
    def __init__(self,tnum=num, tname=name):
        self.num  = tnum
        self.name = tname

    def __str__(self):
        return '%f %s' % (self.num, self.name)

def mod(test, nn):
    test.num = np.random.randn()
    test.name = nn


if __name__ == '__main__':

    num = 10

    tests = np.empty(num, dtype=object)
    for it in range(num):
        tests[it] = Tester(tnum=it*1.0)

    sh_tests = shm.empty(num, dtype=object)
    for it in range(num):
        sh_tests[it] = tests[it]
        print sh_tests[it]

    print '\n'
    workers = [ mp.Process(target=mod, args=(test, 'some') ) for test in sh_tests ]

    for work in workers: work.start()

    for work in workers: work.join()

    for test in sh_tests: print test

打印出:

0.000000 none
1.000000 none
2.000000 none
3.000000 none
4.000000 none
5.000000 none
6.000000 none
7.000000 none
8.000000 none
9.000000 none


0.000000 none
1.000000 none
2.000000 none
3.000000 none
4.000000 none
5.000000 none
6.000000 none
7.000000 none
8.000000 none
9.000000 none

即对象没有被修改。

如何实现所需的行为?


问题答案:

问题在于,当将对象传递给工作进程时,它们会被泡菜包装,运送到另一个过程中,然后在其中解压缩并进行处理。您的对象没有像克隆的那样传递给其他过程。您不返回对象,因此克隆的对象被愉快地修改,然后被丢弃。

看起来这是无法完成的(Python:可以在两个单独的进程之间共享内存中的数据)。

您可以做的就是返回修改后的对象。

import numpy as np
import multiprocessing as mp



class Tester:

    num = 0.0
    name = 'none'
    def __init__(self,tnum=num, tname=name):
        self.num  = tnum
        self.name = tname

    def __str__(self):
        return '%f %s' % (self.num, self.name)

def mod(test, nn, out_queue):
    print test.num
    test.num = np.random.randn()
    print test.num
    test.name = nn
    out_queue.put(test)




if __name__ == '__main__':       
    num = 10
    out_queue = mp.Queue()
    tests = np.empty(num, dtype=object)
    for it in range(num):
        tests[it] = Tester(tnum=it*1.0)


    print '\n'
    workers = [ mp.Process(target=mod, args=(test, 'some', out_queue) ) for test in tests ]

    for work in workers: work.start()

    for work in workers: work.join()

    res_lst = []
    for j in range(len(workers)):
        res_lst.append(out_queue.get())

    for test in res_lst: print test

这的确引起了一个有趣的观察,因为产生的过程是相同的,所以对于随机数它们都以相同的种子开始,因此它们 产生相同的“随机”数。



 类似资料:
  • 问题内容: 我想控制全局变量(或全局范围的变量),使其在程序初始化代码中仅设置一次,然后将其锁定。 我对全局变量使用UPPER_CASE_VARIABLES,但是我想有一种确定的方法,无论如何不要更改变量。 python是否提供(或类似)功能? 您如何控制全局范围的变量? 问题答案: Activestate有一个由古老的Alex Martelli 撰写的题为“ Constants in Pytho

  • 问题内容: 这个问题可能已经有人提出过,而且回答的可能性更大,但是我不知道在哪里可以找到它。 问题:我有一个用于pythonflask的路由器,该路由器需要花费一些时间来处理每个调用的数据。我需要使对路由的每个调用本身就是一个线程,因此它不必等待请求被加载。 问题答案: Flask带有内置的开发Web服务器,但是你不应该在生产环境中使用它。 为了获得一些很酷的功能,例如为每个请求和静态文件服务提供

  • 问题内容: 如何在没有多线程的情况下在python中运行多个进程?例如考虑以下问题: 我们必须制作一个Gui,它具有一个启动一个函数的开始按钮(例如,打印所有整数),还有一个停止按钮,以便单击该按钮可以停止该函数。 如何在Tkinter中做到这一点? 问题答案: 然后,您需要将小部件与启动工作线程的函数绑定在一起。例如: 通过这种方法,您只能通过更改其值来优雅地结束线程。注意,使用多个线程可避免在

  • 接口说明 修改指定的数据处理任务的状态 API地址 POST /api/upload/1.0.0/updateTask 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 title string form 否 标题 position string form 否 位置(例如:'120,30,0') description string form 否 描述 dataGuid str

  • 问题内容: 我一直在尝试以下方法: 我得到的是: 因此,这意味着 my_list 是按值传递的,因为它没有突变。那么,是否将规则传递给另一个进程时确实按值传递规则呢?谢谢。 问题答案: 正如AndréLaszlo所说,该库需要对传递给方法的所有对象进行腌制,以将它们传递给工作进程。酸洗过程导致在工作进程中创建一个不同的对象,因此在工作进程中对该对象所做的更改不会影响父对象中的对象。在Linux上,

  • 问题内容: 我一直在阅读有关Python的多处理模块的信息。我仍然认为我对它可以做什么没有很好的了解。 假设我有一个四核处理器,并且我有一个包含1000000个整数的列表,我想要所有整数的总和。我可以简单地做: 但这仅将其发送到一个内核。 是否有可能使用多处理模块将数组划分为多个,并让每个核获得其部分的总和并返回值,以便可以计算总和? 就像是: 任何帮助,将不胜感激。 问题答案: 是的,可以对多个