gpt4 book ai didi

python - 在 Python 中与 unix 过滤器进程通信

转载 作者:行者123 更新时间:2023-11-28 16:47:57 26 4
gpt4 key购买 nike

我正在编写一个 Python 程序,它需要使用一个用作过滤器的外部 unix 程序来清理许多小字符串。目前,我为每个要清理的字符串创建了一个新的子进程:

import subprocess
def cleanstring(s):
proc = subprocess.Popen(['/bin/filter','-n'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
out, err = proc.communicate(s)
assert not err
return out

显然,这种方法效率极低。启动过滤器子进程并根据需要通过标准输入/标准输出与其通信的有效方式是什么?

我一直在研究使用 Python Queues实现这一点,但他们可能对此有点矫枉过正。代码将从非线程 Web 服务器上的 Django View 调用,因此它只会是一个线程多次调用它。

谢谢!

最佳答案

如果您没有对其进行测量,那么这不是性能问题,更不用说“严重低效”了。

也就是说,您可以像这样与子进程通信:

import subprocess
import sys

p = subprocess.Popen('bc', shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

for i in range(10):
p.stdin.write('%s*2\n' % (i,))
res = p.stdout.readline()
if res:
print "vtrip says %s*2 is %s" % (i, res.strip())
p.stdin.flush()

这会打印 0-9 的 double 值,由同一个 bc 进程返回。应该很容易适应 detex(主要是正确处理冲洗,这样一端就不会卡住等待另一端)。

这是沟通的部分。至于“在 Django 中长时间运行”可能不是一个好主意。队列可能确实太多了。

像 Celery 等任务队列用于独立处理任务,而不是用于处理每个任务的相同长期运行服务。

也许在旁边运行一些小的 python 守护进程,保持过滤器进程打开并处理来自 Django 的请求?我们是在谈论重负载,还是内部负载,例如每天 100 个用户?除了一些粗略的锁定之外,您可能不需要太多同步。

关于python - 在 Python 中与 unix 过滤器进程通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11831954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com