Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python FIFO(命名管道)消息传递障碍_Python_Linux_Unix_Pipe_Named Pipes - Fatal编程技术网

Python FIFO(命名管道)消息传递障碍

Python FIFO(命名管道)消息传递障碍,python,linux,unix,pipe,named-pipes,Python,Linux,Unix,Pipe,Named Pipes,我计划使用Unix命名管道(mkfifo)来实现简单的多进程消息传递。 一条信息将只是一行文字 你能阻止我那样做吗?我应该期待什么样的障碍 我注意到这些限制: 在收到邮件之前,发件人无法继续 接收器被阻塞,直到有一些数据。需要非阻塞IO 当我们需要停止阅读时。例如,另一个线程可能会要求这样做 接收器可以在一次读取中获得多条消息。这些都需要处理 在退出之前 原子消息的最大长度限制为4096字节。这就是Linux上的管道限制(参见Man7管道) 我将用Python实现消息传递。但这些障碍一般都存在

我计划使用Unix命名管道(mkfifo)来实现简单的多进程消息传递。 一条信息将只是一行文字

你能阻止我那样做吗?我应该期待什么样的障碍

我注意到这些限制:

  • 在收到邮件之前,发件人无法继续
  • 接收器被阻塞,直到有一些数据。需要非阻塞IO 当我们需要停止阅读时。例如,另一个线程可能会要求这样做
  • 接收器可以在一次读取中获得多条消息。这些都需要处理 在退出之前
  • 原子消息的最大长度限制为4096字节。这就是Linux上的管道限制(参见Man7管道)
  • 我将用Python实现消息传递。但这些障碍一般都存在

  • 缺乏可移植性-它们主要是Unix的东西。插座更便于携带
  • 更难扩展到多个系统(另一个插座+)
  • 另一方面,对于同一台机器上的进程,我相信管道比套接字更快(通信开销更少)
  • 至于你的局限性

  • 您可以在管道上使用“”来执行非阻塞读取
  • 我通常(在perl中)在以“\n”分隔的管道上打印消息,并从中读取一行,一次只获取一条消息
  • 一定要注意原子长度

  • 我发现在各种选项之间进行了很好的讨论,尽管它有特定于perl的代码。

    发送方和接收方的阻塞都可以通过非阻塞I/O解决

    FIFO的进一步限制:

    • 一次只能有一个客户端
    • 客户端关闭FIFO后,服务器需要重新打开其端点
    • 单向的
    我会使用,它没有上述限制

    作为一个额外的好处,如果您想扩展它以在多台机器之间进行通信,这几乎不需要任何更改。例如,只需打开Python文档页面,将
    socket.AF_INET
    替换为
    socket.AF_UNIX
    (主机、端口)
    替换为
    文件名
    ,即可正常工作


    SOCK\u STREAM
    会给你类似流的行为;也就是说,两个发送可以合并为一个接收,反之亦然
    AF_UNIX
    还支持
    SOCK_DGRAM
    :数据报保证作为一个单元发送和读取,或者根本不发送和读取。(类似地,
    AF_INET
    +
    SOCK_STREAM
    =TCP,
    AF_INET
    +
    SOCK_DGRAM
    =UDP。)

    您希望同时使用多少个进程?如果您有多个读者,则只有一个读者可以看到一条书面消息,即AFAIR。(这次不是100%确定)@rodion——是的,它的目的是在一个阅读器中看到一条消息。FIFO就是这样工作的。为什么阻塞是个问题?我可以看到非阻塞写入。我看不出在等待工作时进行非阻塞读取有什么意义。有许多实例需要进行非阻塞读取(使用select)。例如,多个writer使用不同的管道,因此您不希望只阻塞一个管道。另一个问题是,如果您的工作不是“基于请求的”,比如,如果您通过管道获得更新,希望在等待更新的同时继续工作。第三种方法是,如果您可以一次处理多组消息,那么您希望获得所有可用的消息。在这种特定的上下文中,不基于请求是没有意义的。批次没有意义;管道的缓冲是您所需要的全部“批处理”。接收器中的readline()不能避免您在内部缓冲区中保存多条消息。在退出之前,他们仍然应该被处理。你所说的“一次只有一个客户”是什么意思?我可以在一个FIFO上有多个写入器和读取器。你必须打开FIFO进行多次读取。在同一侦听套接字上接受新连接要干净得多。仅供参考,显然在某些unix平台(Solaris)上,FIFO是双向的。。但你的观点是正确的。改用unix域套接字。在编写器端,除非已经有读卡器(您得到ENXIO),否则无法打开命名管道以非阻塞模式进行写入。OTOH,在读者方面,我没有看到任何迹象表明作者的整理会导致任何问题。