等待信号开始从 python 中的另一个进程生成数据
Wait for signal to start generating data from another process in python
我在python中有两个独立的进程:生产者和消费者。生产者生成文件,消费者对文件进行一些处理。
为了测试这两个应用程序,我发现自己不断地启动两个程序,producer 有延迟功能等,这很痛苦。
在 python 中实现某种信号机制的最快方法是什么,以便 消费者 说 "GO!" 和 生产者 开始做它做的事情。
这样我就可以一直拥有制作人运行。
一个简单的方法(您没有提到您关心的平台,所以我假设您想要跨平台的东西)是一个具有已知端口的 UDP 套接字。如果消费者只监听本地主机端口 12345,它可以在每次需要等待时阻塞 sock.recvfrom
调用,而生产者可以做一个 sock.sendto
来通知它。
例如,这里有一个消费者:
#!/usr/bin/env python
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('127.0.0.1', 12345))
while True:
dummy, addr = sock.recvfrom(1024)
# work on files until done
制作人:
#!/usr/bin/env python
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for thing in things:
# produce files for consumer
sock.sendto(b'X', ('127.0.0.1', 12345))
其他需要考虑的事项:
- 在 Unix 上,使用 Unix 套接字而不是 UDP 套接字有很多优点。
- 在 Windows 上,使用命名管道代替套接字具有优势。
- 您可能想让消费者成为 Unix 上的 daemon(有或没有内置的 "service" 工具来启动和停止它)或 Windows 服务 Windows。 (您甚至可以将服务工具合并到生产者中,因此,例如,如果消费者不存在,则默认行为是启动消费者,然后在完成后将其关闭,但它也可用于启动长期的 - 运行 消费者在后台。)
- 您可以很容易地扩展它以发送更多的内容,而不仅仅是一个空通知——例如,如果您完成制作,则发送一条不同的消息。
我在python中有两个独立的进程:生产者和消费者。生产者生成文件,消费者对文件进行一些处理。
为了测试这两个应用程序,我发现自己不断地启动两个程序,producer 有延迟功能等,这很痛苦。
在 python 中实现某种信号机制的最快方法是什么,以便 消费者 说 "GO!" 和 生产者 开始做它做的事情。
这样我就可以一直拥有制作人运行。
一个简单的方法(您没有提到您关心的平台,所以我假设您想要跨平台的东西)是一个具有已知端口的 UDP 套接字。如果消费者只监听本地主机端口 12345,它可以在每次需要等待时阻塞 sock.recvfrom
调用,而生产者可以做一个 sock.sendto
来通知它。
例如,这里有一个消费者:
#!/usr/bin/env python
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('127.0.0.1', 12345))
while True:
dummy, addr = sock.recvfrom(1024)
# work on files until done
制作人:
#!/usr/bin/env python
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for thing in things:
# produce files for consumer
sock.sendto(b'X', ('127.0.0.1', 12345))
其他需要考虑的事项:
- 在 Unix 上,使用 Unix 套接字而不是 UDP 套接字有很多优点。
- 在 Windows 上,使用命名管道代替套接字具有优势。
- 您可能想让消费者成为 Unix 上的 daemon(有或没有内置的 "service" 工具来启动和停止它)或 Windows 服务 Windows。 (您甚至可以将服务工具合并到生产者中,因此,例如,如果消费者不存在,则默认行为是启动消费者,然后在完成后将其关闭,但它也可用于启动长期的 - 运行 消费者在后台。)
- 您可以很容易地扩展它以发送更多的内容,而不仅仅是一个空通知——例如,如果您完成制作,则发送一条不同的消息。