我有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.stdin
和 sys.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位。