如何将管道中的消息从一个过程流到另一个过程



我有2个Python(2.7(进程。
父程流程需要将一行文本发送到子过程,并且子进程应在其进来时处理它们(不要等待父程进程完成(。

我有此代码不起作用:

# Sender
import subprocess
process = subprocess.Popen(['python', 'child.py'], bufsize=1, stdin=subprocess.PIPE)
try:
    while True:
        process.stdin.write(msg + 'n')  # 'msg' is a changing string
        # process.stdin.flush() <-- commented out since it doesn't help
except KeyboardInterrupt:
    process.stdin.close()
    process.wait()

和儿童过程:

# Receiver
import sys
for line in sys.stdin:
    print line.strip()

问题在于,子进程等待直到父进程打印出消息。

我要实现的是一个儿童过程,该过程一旦将消息写入管道就会处理。

尝试在process.stdin.write()之后添加process.stdin.flush()。这样,您实际将字符串发送到另一个过程。您在这里受苦的是您的内核缓存您所写的所有内容。当实际将数据发送到另一个过程时,它确实会更有效。冲洗内核将数据发送您的数据,而不管内核的缓冲区有多满。

我尝试了您的代码:

# Sender
import subprocess                                                                                                                                                                                           
process = subprocess.Popen(['python', 'child.py'], bufsize=1, stdin=subprocess.PIPE)
msg = "This is my message"
try:
    while True:
        process.stdin.write(msg + 'n')  # 'msg' is a changing string
        process.stdin.flush() # This code works well for me regardless of the presence of this line
except KeyboardInterrupt:
    process.stdin.close()
    process.wait()
# Receiver
import sys
for line in sys.stdin:
    print line.strip()

在这里"效果很好"的情况下,我的意思是我得到"这是我的消息",按照计算机可以执行的快速打印。我正在为记录中的Python 2.7.12尝试。

sys.stdinsys.stdout如何工作的故事使我多次哭泣。在为sys.stdin设置较小的缓冲尺寸时,讨论了类似的问题?

关于您的特定问题,我建议您更改孩子使用sys.stdin.readline(),而不是在sys.stdin上迭代。前者有点"少缓冲":(

while True:
    line = sys.stdin.readline()
    if not line: break
    print (line.strip())

在父母中,您可能需要在呼叫中将bufsize=0设置为Popen(使管道完全没有被封口(,或者如Patrik所建议的那样需要process.stdin.flush()线。我会选择后者。

在python上测试2.7.14在Windows 10 64位。

相关内容

  • 没有找到相关文章

最新更新