我正在使用一个名为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信号传递给停止功能?我只是不知道如何实际编写这行代码。所以,如果有人能够解释这将是伟大的。
感谢您的帮助!
答案 0 :(得分:0)
在停止核心之前,你需要释放插座。
我用:
try:
self.this_application.mux.directPort.handle_close()
except:
self.this_application.mux.broadcastPort.handle_close()
之后我叫停
然后thread.join()