检查正在运行的进程中的对象的值

时间:2016-12-09 23:28:17

标签: python python-2.7

在这个简单的例子中,如何在进程仍在运行时访问计数器对象的值?

{{1}}

2 个答案:

答案 0 :(得分:1)

您必须使用multiprocessing.Queue()multiprocessing.Pipe()在流程之间进行通信。

multiprocessing.Pipe()创建两个端点conn_1conn_2,您必须在主进程中使用其中一个端点,在子进程中使用其中一个端点。

使用poll()检查管道中是否有内容,然后您可以使用recv()接收数据。 (如果你直接使用recv()那么它会阻止程序,直到你发送东西到管道。)

现在您可以使用send()发送带有结果的消息。

我在conn_2

中使用job()
import multiprocessing
import time

class Counter(object):

  def __init__(self):
    self.value = 0

  def update(self):
    self.value += 1

def job(counter, conn):
  while True:
    counter.update()
    if conn.poll():
        print('job:', conn.recv())
        conn.send(counter.value)

if __name__ == '__main__':
  conn_1, conn_2 = multiprocessing.Pipe()

  counter = Counter()

  p = multiprocessing.Process(target=job, args=(counter, conn_2))
  p.start()

  time.sleep(2)

  # I want to check the value of the counter object here
  conn_1.send('give me result')
  print('result:', conn_1.recv())

  p.terminate()

我在这里直接使用conn_2

import multiprocessing
import time

class Counter(object):

  def __init__(self, conn):
    self.conn = conn
    self.value = 0

  def update(self):
    self.value += 1

    if self.conn.poll(): # if message from main process
        print('Counter:', self.conn.recv()) 
        self.conn.send(self.value)

def job(counter):
  while True:
    counter.update()

if __name__ == '__main__':
  conn_1, conn_2 = multiprocessing.Pipe()

  counter = Counter(conn_2)

  p = multiprocessing.Process(target=job, args=(counter,))
  p.start()

  time.sleep(2)

  conn_1.send('give me result')
  print('result:', conn_1.recv())

  p.terminate()

答案 1 :(得分:-1)

您可以考虑将调试器(例如PyDev调试器,GDB或其他)附加到正在运行的进程。然后,您可以使用断点冻结进程并检查状态。