我有兩個 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 腳本時,server1.py它只在我退出服務器 1時運行檔案,它運行server2.py
我的 bash 腳本的輸出:
* 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)
我認為不可能在一個終端中同時運行兩個燒瓶服務器。有什么方法可以使用bash打開一個新終端并server2.py在該終端上運行檔案?由于某些原因,我需要同時運行兩個燒瓶服務器。
uj5u.com熱心網友回復:
希望你一切順利,
感謝您提供腳本和服務器配置。有了這些,我就能夠重現你得到的東西。
所以
我認為有多種解決方案,但我會給你其中兩個:
第一種是將您的服務器部署到 docker 容器中,并使用 bash 腳本或使用 docker-compose 或在其他容器平臺中運行它們。
第二個是,不要在命令“python3 server1.py”的末尾使用“&&”,這意味著“只有在之前的內容被執行并成功的情況下才執行之后的內容,你可以只使用“&”,這意味著“在后臺執行之前的內容并同時執行接下來的內容。這是 bash 腳本:
腳本.sh:
#/bin/bash
python3 server1.py &
python3 server2.py
它對我來說效果很好,但問題是即使你在 bash 腳本輸出上“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 個 dockerfile 構建 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
這是一個小備忘單(但你可以在互聯網上找到很多):https ://www.docker.com/wp-content/uploads/2022/03/docker-cheat-sheet.pdf
猜猜
uj5u.com熱心網友回復:
我同意@gordon-davisson 關于連接器的看法。但是,如果您正在尋找一個bash腳本來運行您的服務器,具有不同的埠配置,最好使用flask runflask 包提供的命令列實用程式。
此外,您無需在腳本中手動更改埠,以防您再次想更改埠、configurationiedebug=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 run 命令中找到有關此主題的重要資訊
uj5u.com熱心網友回復:
指定告訴 Bash在運行第二個命令之前&&等待第一個命令成功退出。
更好的解決方案可能是first_command & second_command &.
這將發送兩個腳本同時在后臺運行并釋放您的 TTY。
幾年前我寫了一篇關于 Linux 命令鏈的文章,根據您的要求,您可能會發現它很有用。
你可以在這里閱讀
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/463892.html
標籤:Python python-3.x 重击 烧瓶
