我试图用python编写一个程序,通过父函数将2个整数写入管道,然后通过子函数读取这些整数。然后,子函数应该打印出这两个函数的乘积。在
问题是,当我运行它时,它会像预期的那样等待5秒,但随后返回的值是441而不是2。在
希望有人能帮忙解决这个代码:)
import os,time
def child(pipein):
while True:
num1 = int(os.read(pipein,32))
num2 = int(os.read(pipein,32))
r=(num1)*(num2)
print(r)
os._exit(0)
def parent():
pipein,pipeout = os.pipe()
x=5
if os.fork()==0:
child(pipein)
else:
while True:
num1=str(2)
num2=str(1)
line=os.write(pipeout,num1.encode())
line=os.write(pipeout,num2.encode())
time.sleep(x)
parent()
直接的问题是,您的孩子有一个无限循环,在做任何事情之前总是反复地读取
num1
(或者,更确切地说,读取两次,然后永远阻塞第三个永远不会出现的输入)。在通过将更多代码移到
while
循环中来修复此问题,如下所示:你也可以删除
os._exit(0)
,因为你无论如何都无法到达它。在下一个问题是编码和解码步骤不匹配。只要你的
sys.getdefaultencoding()
是一个严格的ASCII超集(或者,只要它的数字与ASCII数字匹配),你就可以逃脱惩罚,但你真的不应该默默地依赖它。在接下来,
os.read(pipein,32)
可以给出一次写入的结果,也可以给出多达32个单独写入组合在一起的结果。保证write
(最多为PIPE_BUF)是原子的这一事实并不能帮助您,它只是意味着您不能结束前半部分的写入,而不是下半部分。在所以,最有可能的是,你将在},因此,不是每5秒打印一次{},而是每10秒打印一次{}。但即便如此也不能保证。在
num1
中得到21
,然后5秒钟后在num2
中得到另一个{管道和TCP套接字一样是byte streams, not message streams。这意味着你需要建立某种协议。在
这里有两个非常明显的选择。在
既然32字节大小的记录已经被修正了,那为什么不写一个32字节的记录呢?只需将
^{pr2}$str
行更改为生成一个正好由32个字符组成的字符串,该字符串将在任何已生效的编码中被编码为32个字节,并将解析为适当值的单个整数。像这样:或者,每个记录可以是一对空格分隔的数字,记录可以用换行符分隔。分析起来很简单。尤其是因为您不使用非阻塞管道或任何东西,所以您只需在管道周围放置一个文件对象就可以了。在
这就是我对它的理解
print()
函数在python2.x中工作所必需的exit()
,则不需要循环通过这些修改,我得到以下输出:
^{pr2}$如果要使用多个进程,通常使用
multiprocessing
模块是一个更好的主意。它有进程和进程池的对象,以及队列和管道等通信对象。队列是先进先出的,并且它们是同步的;因此,如果您放入两个项目,则可以读取两个项目。在相关问题 更多 >
编程相关推荐