Python 如何使用来自其他线程的信号事件多线程
我有一个列表写入命令,它需要按线程顺序无限循环。每个调用线程都需要等待recv方法匹配OK或ERROR条件。然后,使用线程再次调用下一个命令。下面是命令。当前,输出缓冲区处于无序状态。它不能使用join。因为,写入命令要比收入缓冲区快。唯一的方法是在调用write方法后暂停,并等待recv方法发出信号条件匹配OK或ERROR。然后,再次迭代下一个命令,以此类推。如何做到这一点 AT+CGMI AT+CGSNPython 如何使用来自其他线程的信号事件多线程,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我有一个列表写入命令,它需要按线程顺序无限循环。每个调用线程都需要等待recv方法匹配OK或ERROR条件。然后,使用线程再次调用下一个命令。下面是命令。当前,输出缓冲区处于无序状态。它不能使用join。因为,写入命令要比收入缓冲区快。唯一的方法是在调用write方法后暂停,并等待recv方法发出信号条件匹配OK或ERROR。然后,再次迭代下一个命令,以此类推。如何做到这一点 AT+CGMI AT+CGSN 信号在编程中是一个非常特殊的上下文。你指的是信号还是“事件”?您的代码似乎没有使用信号。
信号在编程中是一个非常特殊的上下文。你指的是信号还是“事件”?您的代码似乎没有使用信号。@GiacomoAlzetta信号和事件的区别是什么?在依次调用imei线程或制造商线程和无限循环之后,我需要等待recv方法的响应。默认情况下,recv方法将从启动程序开始永远运行。只写依次作为线程和命令运行的方法。将其称为信号或事件合适吗?@davidstephen“将其称为信号或事件?”:涉及操作系统,是python
线程化
模块吗。@Davidspephen Read:特别是在谈到信号时,我们通常指POSIX信号,其中包括SIGKILL
或SIGSTOP
@GiacomoAlzetta,甚至我在2天前就已经读到了使用lock的内容。我还是不明白。但我尝试将全局属性与私有属性_命令一起使用。然后在底部打圈。但它只循环列表中的索引1。什么问题?我编辑了我当前的代码。
class Device():
__command = 'none'
def __init__(self, port, baudrate):
self.__port = port
self.__baudrate = baudrate
def open(self):
try:
self.handle = serial.Serial(self.__port, self.__baudrate)
return True
except SerialException as e:
error = re.findall(r"'(.*?)'", str(e))
self.__error = {'port': error[0], 'description': error[1]}
return None
def __state(self):
if self.open() is None:
if self.__error['description'] == 'Access is denied.':
return True
elif self.__error['description'] == 'Port is already open.':
return True
else:
return False
else:
return True
def recv(self):
while True:
if self.__state():
buffer = self.handle.readline()
if buffer == b'AT+CGSN\r\r\n':
data = []
while True:
buffers = self.handle.readline()
data.append(buffers.decode('UTF-8').strip())
if buffers == b'OK\r\n':
print(data[0])
self.__command = 'done'
break
elif buffers == b'ERROR\r\n':
break
elif buffer == b'AT+CGMI\r\r\n':
data = []
while True:
buffers = self.handle.readline()
data.append(buffers.decode('UTF-8').strip())
if buffers == b'OK\r\n':
print(data[0])
self.__command = 'done'
break
elif buffers == b'ERROR\r\n':
break
else:
print(self.__error['port'] + ' ' + self.__error['description'])
time.sleep(1)
def write(self, command):
if self.__state():
self.__command = 'waiting'
self.handle.write(command.encode('UTF-8') + b'\r')
while self.__command == 'waiting':
if self.__command == 'done':
break
device = Device('COM12', 9600)
device.open()
recv = threading.Thread(target=device.recv)
recv.start()
commands = ['AT+CGSN', 'AT+CGMI']
while True:
for command in commands:
device.write(command)