从在多处理器进程中运行的模块内部更新对象属性

物理学家

我对python相对较新,对于多处理绝对是新的。我正在按照这个问题/答案进行多重处理的结构,但是在中def func_A,我正在调用一个将类对象作为参数之一传递的模块。在模块中,我更改了一个对象属性,我希望主程序可以看到该对象属性并使用该对象属性值更新用户。子进程运行很长时间,因此我需要主程序在运行时提供更新。

我的怀疑是我不了解名称空间/对象作用域或类似的东西,而是从我所读的内容中,将对象(类的实例?)作为参数传递给模块,而不是对对象的引用。复印件。我以为这意味着更改子进程/模块中对象的属性会更改主程序对象中的属性(因为它们是同一对象)。还是让我感到困惑?

我的主程序的代码:

# MainProgram.py
import multiprocessing as mp
import time
from time import sleep
import sys
from datetime import datetime
import myModule

MYOBJECTNAMES = ['name1','name2']

class myClass:
  def __init__(self, name):
    self.name = name
    self.value = 0

myObjects = []
for n in MYOBJECTNAMES:
  myObjects.append(myClass(n))

def func_A(process_number, queue):
  start = datetime.now()
  print("Process {} (object: {}) started at {}".format(process_number, myObjects[process_number].name, start))
  myModule.Eval(myObjects[process_number])
  sys.stdout.flush()

def multiproc_master():
  queue = mp.Queue()
  proceed = mp.Event()

  processes = [mp.Process(target=func_A, args=(x, queue)) for x in range(len(myObjects))]
  for p in processes:
    p.start() 

  for i in range(100):
    for o in myObjects:
      print("In main: Value of {} is {}".format(o.name, o.value))
    sleep(10)

  for p in processes:  
    p.join()

if __name__ == '__main__':
  split_jobs = multiproc_master()
  print(split_jobs)

我的模块程序的代码:

# myModule.py
from time import sleep

def Eval(myObject):

  for i in range(100):
    myObject.value += 1
    print("In module: Value of {} is {}".format(myObject.name, myObject.value))
    sleep(5)
马蒂诺

这个问题/回答您链接到大概可能是一个糟糕的选择作为模板使用,因为它做很多事情,你的代码不需要(更不用说使用)。

我认为您对多处理工作原理的最大误解是认为所有代码都在同一地址空间中运行。主要任务独立运行,每个子任务都有单独的任务。编写代码的方式,每个代码都会以自己的单独myObjects列表结尾这就是为什么主任务看不到其他任何任务所做的任何更改的原因。

虽然办法的份额使用对象multiprocessing模块,这样做往往引入显著的开销,因为保持它还是他们都在同步的所有进程之间需要大量的东西“在幕后”,使发生似乎像他们共享(这是实际发生了什么,因为它们实际上不是因为有单独的地址空间而导致的)。这种开销经常会完全抵消并行处理获得的任何速度。

如文档中所述:“进行并发编程时,通常最好尽可能避免使用共享状态”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章