0

这是我遇到的问题。由于机密性,我不会共享代码,而是提供一些虚拟示例。

假设我们有一个类如下:

class SayHello:
   def __init__(self, name, id):
      self.name=name
      self.id=id
   
   #public func
   def doSomething(self, arg1, arg2 ):
      DoAHugeTaskWithArgument

现在让我们说在其他模块中我们有这个:

class CallOperations:
    def __init__(self):
       self.dummydict={1: {"james":20, "peter":30, "victor":40, "john":45, "ali":21, "tom":41, "hector":37}, 2:{"james":23, "peter":31, "victor":44, "john":46, "ali":23, "tom":44, "hector":35} }
    
    def runProcessors(self):
       #runprocess
       
       for _, v in self.dummydict.items():
          Instances = [SayHello(g,b) for g ,b in v.items()] 
          with ProcessPoolExecutor(max_workers=2) as executor: 
               future = [executor.submit(ins.doSomething, 2, 1235) for ins in Instances]

所以问题从这里开始。我想知道哪些实例在各自的进程中运行 doSomething() 函数。我想在该实例的函数在进程中运行时设置一个变量 = 1,并在它完成时将其设置为零。

每个实例都有自己的名称和 ID。有没有办法找出进程中正在运行的实例的名称?

这个问题让我很困惑,找不到合适的解决方案。

十分感谢。

4

1 回答 1

0

如果我正确理解您的问题,您想知道一个实例SayHello何时执行,何时不执行。您可以使用 - 设置一个变量(1 或 0),Manager但它的用处是有争议的。您可能想改用锁。

我不得不稍微调整一下您的代码,但这是一个正在运行的示例。它选择您的一项任务作为在 while 循环中监视的任务。这是一个永远不会退出的虚拟循环,但你会明白的。它将继续轮询您的一个实例的变量,您可以看到它在该任务运行时发生变化,然后恢复为零。

from time import sleep
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import Manager

class SayHello:
   def __init__(self, name, id):
      self.name=name
      self.id=id
      self.status = Manager().Value("i",0)

   #public func
   def doSomething(self, arg1, arg2 ):
      self.status.value = 1
      sleep(5)
      self.status.value = 0


class CallOperations:
    def __init__(self):
       self.dummydict={1: {"james":20, "peter":30, "victor":40, "john":45, "ali":21, "tom":41, "hector":37}, 2:{"james":23, "peter":31, "victor":44, "john":46, "ali":23, "tom":44, "hector":35} }

    def runProcessors(self):
       #runprocess

       for _, v in self.dummydict.items():
          Instances = [SayHello(g,b) for g ,b in v.items()]
       f = Instances[3]

       executor = ProcessPoolExecutor(max_workers=2)
       future = [executor.submit(ins.doSomething, 2, 1235) for ins in Instances]
       while True:
          print(f.status.value)
          # Insert break condition here
          sleep(0.5)

       executor.shutdown()

foo = CallOperations()
foo.runProcessors()

这样做的问题是它可能会导致竞争条件,具体取决于您在主程序中所做的事情。如果您想在实例处于被动状态时对其执行任何操作,它可能会在您检查变量之后但在您完成主程序中的操作之前进入活动状态。

锁在这里救援,因为您也可以创建共享锁Manager().Lock()。如果您DoSomething()尝试获取锁并且您的主进程在被动实例上操作时执行相同操作,则可以避免此问题。当然,如果您的主程序为长时间的操作保留锁,那么您的主程序可能会阻止执行程序处理,因为如果执行处理到主程序持有锁的那些实例,那么您的两个工作人员将被卡在等待锁上。这种情况不适合使用执行器实现的并行处理。

编辑:如果你只对运行状态感兴趣,你可以检查Future.running()你未来对象的状态,在这种情况下是你future数组中的项目。

于 2021-03-17T15:37:39.340 回答