现在想达到一个情况,本机使用windows开发,linux来运行代码,同时回到第三讲,里面讲到的gunicorn配置的是一个单进程,单线程的运行,这节课主要是目标是win+linux开发和运行分离、gunicorn多线程运行。
ps: 以下步骤推荐在普通用户下进行,尽量别在root用户下执行,为了文件的安全性。
查看自己账户下又哪些用户直接CD到/home
下就可以看 如果手贱给删除了可以再创建用户
useradd zhang
passwd zhang
切换用户
su zhang
如果你前期镜像什么的都是在root账户下运行的为了方便到这里就别切换了。
- 在
~
目录下创建第一个名为pro
的文件夹,并且进入
mkdir pro
cd pro
并且再创建一个名为myweb
的文件夹,并且进入
2. 开始进行文件共享
docker run -it -p 139:139 -p 445:445 --name smb -d --rm \
-v /root/pro:/pro \
dperson/samba \
-u "root;123" \
-s "flakspro;/pro/;yes;no;yes;all;all;all" \
-w "WORKGROUP" \
-g "force user= root" \
-g "guest account= root"
有时间可以和第四讲最后的指令进行对比加深印象
,运行如果报错,先看看你第四讲的容器是不是没关闭
3. 然后复制你虚拟机的ip 到windows环境下的运行里面写上
\\虚拟机ip
可以看到你的机器上出现了文件。
4. 映射网络文件到本地磁盘
截图太麻烦 这里就直接口述了 右键--映射网络驱动器--选择你自己喜欢的磁盘点击完成。
这时候去你的计算机下,会出现一个flaskpro(\虚拟机ip)(z:)的磁盘,接下来打开本地的pycharm,open文件夹,不需要newcreate选择刚才映射好的盘符,注意千万别直接写在盘符下,最好还是选中盘符下的文件夹,避免出现一些不可描述的错误。
5. 在pycharm中,myweb文件夹下,new一个pythonfile--index.py。
这里要说一下对于这个项目是否需要配置python配置,理论上是不需要的,因为你是在linux上运行的,但是有时候为了在开发的时候有代码提示,加快效率可以设置一下。
file--settings--project:myweb--project interpreter 选好python的路径,点ok就可以了,一般来说你在linux下安装了哪些插件,最好是在你本地的开发环境也安装一下,避免两边开发不同步。
from flask import Flask
myapp = Flask(__name__)
@myapp.route("/")
def hello():
return "hello flask1.1"
@myapp.route("/abc")
def abc():
return "hello abc1.1"
- 回到你的xshell里面,可以看到index.py和你外部的文件是同步的,现在我们需要做一个容器,直接采用第三课使用的镜像。
docker run --name myapp -d --rm -p 8082:5000 -v /root/pro/myweb:/app -v /root/conf/gunicorn.conf:/gunicorn.conf myflask:1.2 -w 1 --reload -c /gunicorn.conf index:myapp
注意看看第三课的镜像关没有,避免端口冲突。
注意这里多了一个--reload 可以在开发时使用,当代码发生改变时候能自动重启服务器,从而直接产生变化,只在开发环境用嗷!
7. 启动完成之后直接去windows环境下,打开浏览器访问
虚拟机ip:8082
出现网页,这个时候基本上能正常走通了。
- 现在开始做一个测试
先导入一个time模块 在/
路由下,添加一个time.sleep(5)
from flask import Flask
import time
myapp = Flask(__name__)
@myapp.route("/")
def hello():
time.sleep(5)
return "hello flask1.1 徐霖-牛逼"
@myapp.route("/abc")
def abc():
return "hello abc1.1"
在浏览器里面访问
虚拟机ip:8082
正常的情况是,这个页面会卡住5秒然后才会重新加载出来东西,如果此时访问第二个路由
虚拟机ip:8082/abc
这时候会发现,第二个路由也被迫阻塞了,这就是因为gunicorn在默认的配置下是单进程,单线程的。(进程和线程的关系不懂自己去百度一下)我们回到启动gunicorn的启动命令上来做解释
gunicorn -c /gunicorn.conf mytest:myapp
这个 -c 后面其实还有很多参数,具体的可以看第2课里面的链接。其中有一个是-k 这个参数有一个默认值sync
代表同步阻塞,也就是说,当我们的/
路由被阻塞了,那我们/abc
也必须等待/
运行完之后它才会运行。如何去改变这个值,我们可以通过设置gunicorn的默认配置文件去改变每一个work的线程数,它原本的默认值是1,也就是说它只有单线程,如果我们需要多线程来处理,每个进程它可以处理多少个线程,就需要在这里来设置了。一般建议这个值设置为每核的2-4倍。否则到了高并发服务器压力就过大了。
- 加入线程。
- 关闭上一个容器
docker stop myapp
- 重新启动
docker run --name myapp -d --rm -p 8082:5000 -v /root/pro/myweb:/app -v /root/conf/gunicorn.conf:/gunicorn.conf myflask:1.2 -w 1 --reload --threads 2 -c /gunicorn.conf index:myapp
注意和第一个启动命令对比,多了一个--threads 2
3. 再次测试 发现即使/
路由阻塞了,/abc
也没有阻塞能正常加载出来数据。
ps: 如果设置成多线程模式,那我们的-k
里面的值会变为gthread