在这个简单的例子中,如何在进程仍在运行时访问计数器对象的值?
{{1}}
答案 0 :(得分:1)
您必须使用multiprocessing.Queue()
或multiprocessing.Pipe()
在流程之间进行通信。
multiprocessing.Pipe()
创建两个端点conn_1
,conn_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或其他)附加到正在运行的进程。然后,您可以使用断点冻结进程并检查状态。