![](/img/trans.png)
[英]How can I run two flask servers in two threads/processes on two ports under one python program?
[英]How to run two flask servers on different ports at the same time using bash script
我有兩個 python 文件。
server1.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello world from server 1."
if __name__ == "__main__":
app.run(port=3000)
server2.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello from server 2."
if __name__ == "__main__":
app.run(port=4000)
現在,我需要使用 bash 腳本同時運行這兩個服務器。
我在我的 bash 腳本中嘗試過這個。
python3 server1.py && python3 server2.py
當我運行這個 bash 腳本時,它只在我退出服務器 1時運行server1.py
文件,它運行server2.py
我的 bash 腳本的 Output:
* Serving Flask app 'server1' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:3000 (Press CTRL+C to quit)
^C * Serving Flask app 'server2' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:4000 (Press CTRL+C to quit)
我認為不可能在一個終端中同時運行兩個 flask 服務器。 有什么方法可以使用bash打開一個新終端並在該終端上運行server2.py
文件? 由於某些原因,我需要同時運行兩個 flask 服務器。
希望你一切順利,
感謝您提供腳本和服務器配置。 有了這些,我就能重現你得到的東西。
所以
我認為有多種解決方案,但我會給你兩個:
第一種是將您的服務器部署到 docker 容器中,並使用 bash 腳本或 docker-compose 或其他容器平台運行它們。
第二個是,不要在命令“python3 server1.py”的末尾使用“&&”,這意味着“僅當執行之前的內容並成功時才執行此后的內容,您可以只使用“&”,這意味着“在后台執行之前的內容,同時執行接下來的內容。 這是 bash 腳本:
腳本.sh:
#/bin/bash
python3 server1.py &
python3 server2.py
它對我來說效果很好,但問題是,即使你在 bash 腳本 output 上“ctrl-c”,server2 也會停止,但 server1 不會停止:
❯ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...
bguess 21149 0.0 0.2 178708 26480 pts/3 S 00:48 0:00 python3 server1.py
...
你將不得不用 kill "PID_HERE" 手動殺死它(在我的例子中是 kill 21149 。)
相反,這是 docker 的解決方案:首先讓我們修改您的服務器以偵聽端口 4000 上的所有主機(因為 server1 和 server2 將被隔離在 2 個不同的容器中,因此不會發生沖突)
服務器1.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello world from server 1."
if __name__ == "__main__":
app.run(port=4000, debug=True, host='0.0.0.0')
服務器2.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello from server 2."
if __name__ == "__main__":
app.run(port=4000, debug=True, host='0.0.0.0')
接下來,讓我們記下構建容器鏡像所需的兩個 dockerfile:
但首先是我們將復制到 docker 圖像中的 requirements.txt 文件:
要求.txt:
flask
碼頭文件1:
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY server1.py .
CMD [ "python3", "-m" , "server1", "run", "--host=0.0.0.0:4000"]
EXPOSE 4000
碼頭文件2:
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY server1.py .
CMD [ "python3", "-m" , "server1", "run", "--host=0.0.0.0:4000"]
EXPOSE 4000
現在讓我們從這 2 個 dockerfiles 構建 docker 個圖像:
docker build -t so-flask-s1 -f dockerfile1 .
docker build -t so-flask-s2 -f dockerfile2 .
現在讓我們運行我們的容器:
❯ docker run --rm -d -p 8081:4000 --name server1 so-flask-s1
7cfb16a63cd6de6ff2ecb9d728302a9f9ef0a848ab81a5cedf6ce9f60eaa66ae
❯ docker run --rm -d -p 8082:4000 --name server2 so-flask-s2
209013ba82f8c701ba46fd67675b9151056921a5a8b5a916e7f29b9014e7c9a1
讓我們檢查它們是否都在運行:
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
209013ba82f8 so-flask-s2 "python3 -m server2 …" 3 seconds ago Up 2 seconds 0.0.0.0:8082->4000/tcp server2
7cfb16a63cd6 so-flask-s1 "python3 -m server1 …" 10 seconds ago Up 9 seconds 0.0.0.0:8081->4000/tcp server1
現在,讓我們檢查一下我們的瀏覽器:
希望這對您有所幫助。
刪除圖像:docker rmi #example:docker rmi so-flask-s2
使用以下命令殺死容器:docker kill #example:docker kill server2
這是一個小備忘單(但您可以在 inte.net 上找到很多備忘單): https://www.docker.com/wp-content/uploads/2022/03/docker-cheat-sheet.pdf
猜測
我同意@gordon-davisson 關於連接器的觀點。 但是,如果您正在尋找bash
腳本來運行具有不同端口配置的服務器,最好使用 flask flask package 提供的flask run
命令行實用程序。
此外,您不需要在腳本中手動更改端口,以防您再次想要更改端口或configuration
,即debug=True/False
或hostname=0.0.0.0 or 127.0.0.1
它的一些基礎知識是(來自它的幫助描述):
flask run --help
Usage: flask run [OPTIONS]
Run a local development server.
This server is for development purposes only. It does not provide the
stability, security, or performance of production WSGI servers.
The reloader and debugger are enabled by default if FLASK_ENV=development
or FLASK_DEBUG=1.
Options:
-h, --host TEXT The interface to bind to.
-p, --port INTEGER The port to bind to.
--cert PATH Specify a certificate file to use HTTPS.
--key FILE The key file to use when specifying a
certificate.
--reload / --no-reload Enable or disable the reloader. By default
the reloader is active if debug is enabled.
--debugger / --no-debugger Enable or disable the debugger. By default
the debugger is active if debug is enabled.
--eager-loading / --lazy-loader
Enable or disable eager loading. By default
eager loading is enabled if the reloader is
disabled.
--with-threads / --without-threads
Enable or disable multithreading.
--extra-files PATH Extra files that trigger a reload on change.
Multiple paths are separated by ':'.
--help Show this message and exit.
您可以在flask 運行命令中找到有關此主題的重要信息
指定&&
告訴 Bash 在運行第二個命令之前等待第一個命令成功退出。
更好的解決方案可能是first_command & second_command &
。
這將發送兩個腳本同時在后台運行並釋放您的 TTY。
幾年前我寫了一篇關於 Linux 命令鏈的文章,根據你的要求你可能會發現它很有用。
你可以在這里閱讀
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.