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



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

对于多个PLC,有一个处理循环,它创建一个应用程序(提供PLC ip地址),使用应用程序在PLC上执行读写操作,通过从核心模块调用BACpypesstop(*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() 

我似乎没有正确地终止应用程序。所以,我知道stop(*args)是根据BACpypes文档注册为信号处理程序的。这是我从这个链接中提取的一个片段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

我觉得我需要提供一个终止期信号,使ip地址再次可用。我不知道该怎么做。这是我的问题。。。

1) 在本例中,我认为12345是流程编号。我该如何计算线程的数字?

2) 一旦我有了这个数字,我该如何将kill-TERM信号传递给停止函数?我只是不知道如何写这行代码。所以,如果有人能解释这一点,那就太好了。

谢谢你的帮助!

在停止内核之前,您需要释放套接字。

我使用:

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

之后我叫停止则CCD_ 1

相关内容

  • 没有找到相关文章

最新更新