Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用来自其他线程的信号事件多线程_Python_Python 3.x_Python 2.7 - Fatal编程技术网

Python 如何使用来自其他线程的信号事件多线程

Python 如何使用来自其他线程的信号事件多线程,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 信号在编程中是一个非常特殊的上下文。你指的是信号还是“事件”?您的代码似乎没有使用信号。

我有一个列表写入命令,它需要按线程顺序无限循环。每个调用线程都需要等待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)