Linux上python的程序间通信

2024-06-23 19:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

关于如何做这些事情,有很多例子可以找到:

1)同一程序中不同进程之间的通信。在

2)通过网络在客户机/服务器之间进行通信

然而,这个问题在我看过的任何地方都没有很好的例子:

  • 将字符串从python程序a发送到程序B的规范方法是什么,程序B阻塞并处理此字符串,然后在循环中等待另一个字符串?在

我觉得我已经接近答案很多次了,但从来没有创造出一个有效的例子。在

其他隐含要求:

  • 实际上是两个不同的程序:这个例子实际上需要有两个不同的程序(即两个文件进度计划, 进度计划它可以在同一台机器上的两个屏幕中分别从命令行运行),而不是使用任何类型的分叉或多进程来创建客户机和服务器。在
  • 请建议这样做的方法,即允许发送长度不超过合理长度的可变长度分隔字符串,而不必获得正确的数据大小的精确字节计数。(后者在实现中更容易出错)。在
  • 理想的做法是不使用本地主机internet连接

例如,当读者使用:

pipein = open(pipe_name, 'r')
while program.KeepRunning:
    action = pipein.readline()[:-1]
    program.processLine(line)
    time.sleep(1)

作者使用:

^{pr2}$

http://www.python-course.eu/pipes.php所建议 读取器陷入一个无限循环中,读取空字符串。在

有趣的是,将if(action == 'enable'): longFunction()添加到program.processLine函数中会导致longFunction中的部分代码在永远无法读取空行之前被执行。在

另一方面,所有使用更现代、更低级的subprocess模块的示例只涉及多线程应用程序,而不是多个应用程序。其他实现包括套接字和网络。在

当我尝试使用套接字时,这会导致泛型的“出了问题”类型错误,并有许多可能的原因Error 111: “connection refused”显示“有时”。作为python代码的一部分,在接收到某些命令时会实际修改网络配置(例如,它使用各种参数调用诸如iptc和{}等命令),使用到{}的网络连接是应该避免的,这会导致难以调试和通常令人讨厌的问题。除了第二个程序在同一台机器上运行时不必要的部分,所以任何程序间通信都不需要使用网络接口。在


Tags: 方法字符串程序网络机器类型客户机进程
1条回答
网友
1楼 · 发布于 2024-06-23 19:26:36

那是故意的行为。查看this answer中类似的问题和FIFO行为的概述。与您的问题相关的部分是:

When there are no more writers (...) readers are notified about that through read() returning the EOF.

file.readline()docs表示''(空字符串)表示{}已到达:

if f.readline() returns an empty string, the end of the file has been reached, while a blank line is represented by '\n', a string containing only a single newline.

就这样。在无限循环中,每次尝试读取时都会得到一个空字符串,表示没有更多的写入程序连接。在

没有什么可以阻止您使用命名管道来解决您的任务。最简单的方法就是在没有作家的情况下睡一段时间。以下是工作示例:

# server.py

import os
import time

pipe_name = 'pipe_test'

if not os.path.exists(pipe_name):
    os.mkfifo(pipe_name)

with open(pipe_name, 'r') as pipe:
    print("Listening for actions...")
    while True:
        action = pipe.readline()[:-1]
        if action == '':
            print("No clients. Sleeping...")
            time.sleep(1)
        else:
            print("Action received:", repr(action))
^{pr2}$

注意事项:

  • 使用os.open(),这是一个低级函数。可以使用open()与命名管道交互。在
  • 打开命名管道以读取blocks,直到连接第一个写入程序。所以在第一个客户机连接到管道之前,您不会在输出中看到Listening for actions...。作家没有读者也一样。在
  • 您询问“哪个块并处理此字符串,然后在循环中等待另一个字符串”。除非下一个线程不处理当前的字符串,否则它不会被处理。在

相关问题 更多 >

    热门问题