Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 Flask应用程序调用的串行库中的侦听线程导致其挂起_Python_Multithreading_Flask_Serial Port_Flask Socketio - Fatal编程技术网

Python Flask应用程序调用的串行库中的侦听线程导致其挂起

Python Flask应用程序调用的串行库中的侦听线程导致其挂起,python,multithreading,flask,serial-port,flask-socketio,Python,Multithreading,Flask,Serial Port,Flask Socketio,我正在构建一个本地Flask web界面,不打算让多个用户通过Raspberry Pi控制电机驱动器。我找到了一个名为Thorpy的库来控制电机驱动器,它可以很好地与测试脚本一起工作 这里是从无关部分清除的端口类,用于创建与电机驱动器的串行连接 Thorpy:port.py 类端口: 准单身人士名单 静态端口列表=weakref.WeakValueDictionary 静态\端口\列表\锁定=threading.RLock 定义初始自身、端口、序列号: 超级__ self.\u lock=thr

我正在构建一个本地Flask web界面,不打算让多个用户通过Raspberry Pi控制电机驱动器。我找到了一个名为Thorpy的库来控制电机驱动器,它可以很好地与测试脚本一起工作

这里是从无关部分清除的端口类,用于创建与电机驱动器的串行连接

Thorpy:port.py

类端口: 准单身人士名单 静态端口列表=weakref.WeakValueDictionary 静态\端口\列表\锁定=threading.RLock 定义初始自身、端口、序列号: 超级__ self.\u lock=threading.RLock 自我锁定 自身缓冲区=b self.\u未处理的\u消息=queue.queue 打印端口:串行 self.\u serial=serial.Serialport, 波特率=115200, bytesize=serial.EIGHTBITS, 奇偶校验=串行。奇偶校验\u无, 停止位=串行。停止位\u一, 写入超时=0.1,拉约 rtscts=真 self.\u端口=端口 self.\u debug=True 自锁释放 self.daemon=False printConstructed:{0!r}.formatself self.\u thread\u main=threading.current\u thread self.\u thread\u worker\u initialized=threading.Event self.\u thread\u worker=threading.Threadtarget=Port.run,args=weakref.proxyself, self.\u thread\u worker.daemon=True self.\u thread\u worker.start self.\u线程\u工作线程\u已初始化。等待 打印端口:fin init 打印 时间到了 @静力学方法 def runself: 尝试: self.\u continue=True 超时=1 self.\u thread\u worker\u initialized.set 当self.\u thread\u main.处于活动状态时: 打印运行 避免持锁的诀窍 r、 w,e=选择。选择[自身],[],超时 msg=self.\u recv\u messageFalse 如果msg不是None: printRUN:,msg message\u handled=self.\u handle\u messagemsg 如果未处理消息,请执行以下操作: 打印未处理的消息,msg self.\u未处理的\u messages.putmsg self.\u serial.close 除引用错误外: 打印例外:停止运行 传递对象已删除 现在这里只介绍Flask服务器的相关部分: webapp.py

从烧瓶进口* 从flask_socketio导入socketio 从thorpy.comm.port导入端口 app=烧瓶名称__ regul=regul socketio=SocketIOapp @应用程序路线“/pompe” def page_pompe: 返回渲染模板'pompe.html' @socketio.on'drv_connect' def on_连接状态: 串行端口=[x[0],x[1],dicty.split'=',1表示x[2]中的y。如果y中的'='表示x中的x,则分割'' 对于usb.core.findfind_all=True,custom_match=lambda x:x.bDeviceClass!=9: 尝试: 如果x[2],则在串行_端口中x的端口_候选项=[x[0]。获取'SER',无==dev.serial_number] 断言lenport_候选者==1 p=Port.createport,dev.serial_编号 除: 通过 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': socketio.runapp,调试=True,主机=0.0.0.0',端口=5000 当网页上的按钮调用on_connect函数时,端口对象被创建并卡在其运行函数printing run的while循环中,每隔几秒钟运行一次,而flask服务器挂起

我怀疑这与在端口类的init中创建线程的部分有关,但是我一直使用线程,我不完全理解它

我试过的 我试图从Flask应用程序内的线程库创建一个线程,以调用端口对象的创建并封装其内部运行线程,但这没有什么区别


如果我创建一个进程而不是线程,Flask应用程序将保持活动状态,但我无法从其他函数访问端口对象,也无法向马达驱动程序发送命令。

我假设您使用的是eventlet或gevent?您执行的任何I/O都必须是非阻塞的。您是否对标准库进行了修补以使I/O代码无阻塞?在尝试eventlet之后,我现在使用gevent。在回答之前,您注意到使用debug=False解决了问题。我尝试过保持debug=True并添加monkey.patch\u all,效果也很好,因此我认为禁用调试模式必须等同于禁用monkey patch?在缺点方面,此解决方案会中断Raspberry Pi monkey patch上传感器的回调,从而禁用该部分代码。我不明白为什么,因为所有其他回调都工作正常。我假设您使用的是eventlet或gevent?您执行的任何I/O都必须是非阻塞的。你给标准库打过补丁吗
要使I/O代码无阻塞,请在尝试eventlet后立即使用gevent。在回答之前,您注意到使用debug=False解决了问题。我尝试过保持debug=True并添加monkey.patch\u all,效果也很好,因此我认为禁用调试模式必须等同于禁用monkey patch?在缺点方面,此解决方案会中断Raspberry Pi monkey patch上传感器的回调,从而禁用该部分代码。我不明白为什么,因为所有其他回调都工作正常。