在python中,是否有一种跨平台的方式在一个进程中创建类似于Windows的名为Event的东西,并从另一个进程设置它以向第一个进程发送信号?
我的具体问题是我需要创建一个进程,在启动时将检查自身的任何其他实例是否正在运行,如果是,则发出退出信号。使用Windows API,我会将CreateEvent
与lpName
参数和SetEvent
一起使用。
答案 0 :(得分:2)
我花了大约一天的时间来寻找一个好的答案,这就是我现在想出来的:
可以使用信号向流程指示需要进行某些更改,但是在我处理的更复杂的遗留代码库中会导致流程崩溃。信令基于python signal docs中断各种I / O过程。您可以使用signal.SIGUSR1
import signal
def signal_handler(signum, stack):
print('Signal %d received'%signum)
signal.signal(signal.SIGUSR1, signal_handler)
此代码可以在Linux等人中触发。通过:
$ kill -s SIGUSR1 $pid
我目前倾向于kazoo Python Zookeeper库。它需要站起来Zookeeper作为基础设施。
在我的情况下,我还需要切换配置值。但Zookeeper支持许多可满足您需求的处理器间通信工具。
更新:
我最终确定了一个命名管道(FIFO),在readline
的线程内调用它。
if not os.path.exists(fifo_name):
os.mkfifo(fifo_name)
while True:
with open(fifo_name, 'r') as config_fifo:
line = config_fifo.readline()[:-1]
print(line)
我使用tempfile.gettempdir()
找到将FIFO放入文件系统的好位置。然而,它需要相当多的改进,因为我不想在你可能的时候解析传递的内容。此外,如果您计划拥有该事件的多个消费者,那么您将把它传播给只有一个消费者,因为它是一个队列。
答案 1 :(得分:0)
在我看来,这不是一个问题,关于这是否可能在Python中,但是这样的跨平台方法是否存在:如果有,那么即使没有直接编写的Python存在,人们总是可以使用subprocess.call()
等进行系统调用。
至于是否有可能,我不能自称是专家,但有些搜索引起了these discussions,这可能对你有帮助。