流式多处理进程输出

  • 本文关键字:进程 输出 处理 python
  • 更新时间 :
  • 英文 :


我有一个函数,在返回结果之前生成输出。当该函数运行时,我想将中间输出流式传输到前端,这样用户在等待结果时就知道发生了什么。我试图通过多处理来实现这一点,但中间输出和结果在结束时立即打印。我在任何地方都找不到类似的问题,所以非常感谢您的建议。这是目前为止我的不良行为代码:

from multiprocessing import Process, Pipe
from sklearn.manifold import TSNE
import random
import io
import sys
def TSNE_transform():
X = [[random.randint(1,9) for i in range(9)] for j in range(10)]
model = TSNE(n_components=3, verbose=3)
result = model.fit_transform(X)
return result
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=TSNE_transform)
p.start()
while True:
print(parent_conn.recv())
if parent_conn.recv() == None:
break
p.join()

函数TSNE_transform产生中间输出。

我也试图重定向标准输出像这样,但我不确定如何可以流到前端:

old_stdout = sys.stdout
# Assign buffer to new_stdout
new_stdout = io.StringIO()
# Assign stdout to buffer
sys.stdout = new_stdout
X = [[random.randint(1,30) for i in range(30)] for j in range(100)]
model = TSNE(n_components=3, verbose=3)
result = model.fit_transform(X)
# Get values
output = new_stdout.getvalue()
# Revert to original stdout
sys.stdout = old_stdout
print(output)

欢迎任何帮助:)

您应该使用Queue以便与Process.通信
下面的简单示例取自文档。

import multiprocessing as mp
def foo(q):
q.put('hello')
if __name__ == '__main__':
ctx = mp.get_context('spawn')
q = ctx.Queue()
p = ctx.Process(target=foo, args=(q,))
p.start()
print(q.get())
p.join() 

最新更新