信号处理程序接受(* args),我该如何提供它们?

时间:2014-11-03 18:57:04

标签: python signal-handling

我正在使用一个名为BACpypes的库来通过网络与PLC进行通信。这里的简短版本是我需要在自己的线程中启动BACpypes应用程序,然后在这个单独的线程中对plc执行读/写操作。

对于多个PLC,有一个处理循环,用于创建应用程序(提供plc ip地址),使用应用程序在plc上执行读写操作,通过调用BACpypes stop(* args)来杀死应用程序核心模块,在线程上调用join,然后继续到列表中的下一个ip地址,直到我们重新开始。这适用于我们拥有的尽可能多的IP地址(PLC),但只要我们再次返回第一个IP地址(PLC),我就会收到错误:

socket.error: [Errno 98] Address already in use

这是我的线程类的简短代码,它使用BACpypes核心的stop()和run()函数。

class BACpypeThread(Thread):
    def __init__(self, name):
        Thread.__init__(self)
        Thread.name = name
    def run(self):
        run()
    def stop(self):
        stop() 

好像我没有正确查杀该应用程序。所以,我知道根据BACpypes文档,stop(* args)被注册为信号处理程序。以下是我从此链接http://bacpypes.sourceforge.net/modules/core.html

中提取的代码段
core.stop(*args)
Parameters: args – optional signal handler arguments
This function is called to stop a BACpypes application. It resets the running boolean value. This function also installed as a signal handler responding to the TERM signal so you can stop a background (deamon) process:

$ kill -TERM 12345

我觉得我需要提供一个kill -term信号来让ip地址再次可用。我不知道该怎么做。这是我的问题......

1)在这个例子中,12345是我认为的过程编号。我如何找出我的线程的数字?

2)一旦我有了这个号码,我如何实际将kill -TERM信号传递给停止功能?我只是不知道如何实际编写这行代码。所以,如果有人能够解释这将是伟大的。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

在停止核心之前,你需要释放插座。

我用:

    try:
        self.this_application.mux.directPort.handle_close()
    except:
        self.this_application.mux.broadcastPort.handle_close()

之后我叫停 然后thread.join()