I'm working on a camera endpoint for an IoT application and I want to start and stop a flask app on command to show a webpage with streaming camera data. I have all the individual pieces working but it's failing when I put them together.
If I start a flask process after starting another thread it complains that address is already in use. Here's a stripped down example:
#!/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()
Comment out start_thread() and just run start_process() and it's ok. Comment out start_process() and just run start_thread() and it's ok. Run both and get an address already in use error even though they're listening on different ports.
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
I want to run the flask app in a way that will let me start and stop it on command. Should I be doing it a different way?
 
    