【发布时间】:2020-07-20 15:55:14
【问题描述】:
我正在为 IoT 应用程序开发摄像头端点,我想根据命令启动和停止烧瓶应用程序以显示带有流式摄像头数据的网页。我有所有单独的部分工作,但当我把它们放在一起时它失败了。
如果我在启动另一个线程后启动烧瓶进程,它会抱怨地址已在使用中。这是一个精简的示例:
#!/usr/bin/env python3
import os
import threading
from flask import Flask
import socket
import time
from multiprocessing import Process
app = Flask(__name__)
def main():
start_thread(udp_listener)
start_process(runflask)
while True:
time.sleep(1)
def start_thread(function, arguments=()):
th = threading.Thread(target=function, args=arguments)
th.daemon = True
th.start()
def start_process(function):
server = Process(target=function)
server.start()
while True:
time.sleep(60)
server.terminate()
server.join()
def udp_listener():
while True:
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.bind(('', 9000))
print('udp listening on port 9000')
while True:
data, server = s.recvfrom(4069)
print('received:')
def runflask():
app.run(host='0.0.0.0', port=8001, debug=True)
if __name__ == "__main__":
main()
注释掉 start_thread() 并运行 start_process() 就可以了。 注释掉 start_process() 并运行 start_thread() 就可以了。 运行两者并获得地址已在使用中的错误,即使它们正在侦听不同的端口。
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
self.run()
File "/usr/lib/python3.5/threading.py", line 862, in run
self._target(*self._args, **self._kwargs)
File "./webcam_test.py", line 35, in udp_listener
s.bind(('', 9000))
OSError: [Errno 98] Address already in use
我想以一种可以让我根据命令启动和停止它的方式运行烧瓶应用程序。我应该换一种方式吗?
【问题讨论】: