uwsgi托管django的坑(代码片段)

冷暖自知~~~ 冷暖自知~~~     2023-04-13     516

关键词:

背景:

本人接受了一个python3 django框架写的系统,有api有页面。

部署方式是在win服务器上使用docker toolbox部署的,这是一种一起docker desktop还没萌芽或者刚刚萌芽时就存在的一种技术,简单说就是让人可以在win系统上使用docker,构建docker镜像,启动docker容器等待。

这次有一个开发需求:

用户A通过http形式调用我方的接口告诉我他出错了,但是他也有可能从错误中恢复过来,也有可能无法恢复。

如果恢复过来,就通过同一个接口使用不同参数告诉我他已经恢复了,我方系统就啥动作都不要做了。

如果一直没有恢复(也就是一直没有再通过这个接口将表示已经恢复的参数传递给我方系统),10秒钟后,我方系统就需要再告知第三方的一个系统B,让系统B知道用户A这家伙出错了,然后系统B会执行某种动作(具体是什么动作我方系统不需要知道)。我方通知系统B也是通过http形式。

 

以上就是全部背景了,按理说,这么个小需求应该不难实现。事实也是如此,我在本地没多少时间就开发完成了,使用的是`threading.Timer`方法,设定一个定时器,10秒后调用某个方法发起http请求到系统B,如果10秒内再次收到用户A的已恢复调用,则调用`threading.Timer`返回对象的`cancel()`方法取消这个定时器就好了。

本地调试都没有问题,一切正常。

部署过程简单,只是把我新写的python文件放到服务器的对应目录上,然后找到对应的docker容器,restart一下就好了。

部署到服务器上后,发现问题不小!!!

这个定时器指定的方法怎么弄都不执行,除非你再次请求这个接口,而且是在第二次请求这个API接口的同时执行!WTF!!这和我想的不一样啊!我的想法是只要请求了一次这个接口,然后就等着10秒后就可以自动执行指定的通知系统B的方法了,而且我在本地调试时所看到的现象也是如此。但是,服务器上这个现象就不是这样!它偏不!

来来回回回回来来的改代码,验证,怀疑是不是哪里报错了呀?是不是服务器的docker容器的linux环境和本地开发的win环境不一样导致的啊?是不是服务器docker toolbox这个已经废弃的技术有某种隐藏BUG啊?甚至写了一小段代码,模仿这个等待10秒后发起http请求的逻辑,用一个简单的python脚本承载。然后在服务器对应的那个docker容器内部通过python xxx.py方式运行这小段代码,实验结果也是和我的预期一样的,定时器正常工作了,10秒后http请求顺利发起了。

怀疑人生了。

想着是不是`threading.Timer`方法设置的定时器是不是有缺陷,但是网上找了很久也没看到有人说有缺陷的。

行吧,我且换一种实现试试,这次用`apscheduler.schedulers.background`模块的`BackgroundScheduler`,主要代码如下:

#实例化
timer = BackgroundScheduler()
timer.add_job(callSystemB, \'date\',
                           run_date=datetime.datetime.now() + datetime.timedelta(seconds=10),
                           args=[data])
#启动 timer.start()
#不需要时(也就是用户A告知已经恢复时)就shutdown这个计划: timer.shutdown()

 

写完代码更新到服务器上去,重启docker容器。访问,还是有问题。

 

 但是这次问题清晰多了,很多人碰到过:https://www.cnblogs.com/zhuminghui/p/9252878.html,https://www.jianshu.com/p/78c46b0716b9

到这才知道是uwsgi托管django搞的鬼,uwsgi默认是one thread one processor,没有请求的时候,进程被挂起,子线程也就被挂起了。

在uwsgi.ini配置文件中添加了`enable-threads = true`后,定时器终于如我预期的工作了,问题解决。

然后再回头一想,是不是之前的`threading.Timer`也是由相同的问题造成无法执行的?再次验证后发现果然如此!!

可真坑!!

线上项目部署(代码片段)

...址孙铭浩博客地址  孙铭浩踩过的坑centos7下部署django项目 我们项目部署需要用到uwsgi,它可以开启多进程,启动多个uwsgi实例,然后让nginx来做静态文件处理,以及负载均衡和反向代理.启动多个uwsgi通过nginx做集群,静态文件... 查看详情

nginx+uwsgi02---django部署(代码片段)

...─urls.py│└──wsgi.py└──myweb_uwsgi.ini  在我们通过Django创建myweb项目时,在子目录myweb下已经帮我们生成的wsgi.py文件。所以,我们只需要再创建myweb_uwsgi.ini配置文件即可,当然,uwsgi支持多种 查看详情

nginx+uwsgi部署django+vue项目(代码片段)

nginx+uwsgi部署Django+Vue项目windows本地DNS解析文件路径C:\Windows\System32\drivers\etc单机本地测试运行方式,调用django第三方的wsgifef单机模块,性能很低python3manage.pyrunserver0.0.0.0:8000使用uwsgi去启动django项目,支持并发更多准备前后端代码... 查看详情

django启动uwsgi报错(代码片段)

查看uwsgi.log***StartinguWSGI2.0.17(64bit)on[ThuApr517:46:152018]***compiledwithversion:4.4.720120313(RedHat4.4.7-18)on05April201802:08:03os:Linux-2.6.32-642.6.2.el6.x86_64#1SMPWedOct2606:52:09UTC2016no 查看详情

nginx+uwsgi部署django(代码片段)

1.安装nginxyuminstall-ynginx(需要epel源)2.安装环境#可以考虑使用虚拟化环境,本处不再使用3.安装uwsgiyumgroupinstall"Developmenttools"yuminstallzlib-develbzip2-develpcre-developenssl-develncurses-develsqlite-develreadline-develtk-de 查看详情

部署django项目nginx+uwsgi(代码片段)

记录一下使用Nginx+uwsgi部署Django项目关于域名和端口在这个教程中,我们将假设你的域名为 example.com 。用你自己的FQDN或者IP地址来代替。从头到尾,我们将使用8000端口作为web服务器的公开端口,就像Djangorunserver默认的那... 查看详情

跨过django的坑(代码片段)

在最近的Django的学习中,慢慢的开始踩坑,开此栏,专为收纳Django的坑,在以后的学习中以便警示。(使用工具为pycharm专业版2018.2.4,python3.5.2,Django版本2.1.3) 1、关于提取表单的数据。在前端通过表单提交数据,请求为post... 查看详情

uwsgi快速入门(代码片段)

...应用1、运行2、添加并发三、结合Web服务器使用1、Flask2、Django3、Nginx配置uwsgi快速入门一、概述1、简单介绍WSGI(WebServerGatewayInterface),定义了web服务器(nginx、apache、iis等)和web应用(或者将web框架,flask、django等)之间的接口... 查看详情

centos7部署django项目(代码片段)

...置文件格式可以是xml也可以是ini文件,这里使用ini文件在django项目的根目录新建一个uwsgi.ini文件,写入以下内容[uwsgi]http=:8000#绑定端口chdir=/home/trunk/#项目主目录module=SpiderServer.wsgi#项 查看详情

django+uwsgi+nginx+pandas导出excel超时问题(代码片段)

今天又是快乐学习的一天django+uwsgi+nginx+pandas导出excel超时问题一、问题现象和日志报错  之前在项目实现了excel导入导出:django导入导出excel实践,之前一直稳定运行,突然得知导出用户信息时出现nginx错误报告:  查看nginx... 查看详情

uWSGI + Django + Nginx - 运行时错误

...第一篇文章+帮助:我正在尝试设置一个Ubuntu16.04服务器来托管我的Django应用程序,但是我遇到了一个奇怪的uWSGI错误;每当我跑步时:uwsgi--sockettest.sock--moduleapi.wsgi:ap 查看详情

Apache , uwsgi , django 查找时间

...ime【发布时间】:2017-05-0902:30:14【问题描述】:我的设置托管在AWSEC2上,在我的ubuntu机器上,运行带有uwsgi和apache的django服务器。我一直试图弄清楚为什么devenvVSlocalenv有如此不同的性能。使用本地服务器,我在80毫秒内返回我的i... 查看详情

django+uwsgi+docker+k8s(代码片段)

其实这个搞这个就因为一点小事,django的日志无法按日期切分原来方式都是直接用manage.pyrunserver的,听取了同事的建议开始准备使用uwsgi来搞 1.安装uwsgi pipinstalluwsgi  2.django新增一个uwsgi的配置文件[uwsgi]http=:端口sock... 查看详情

08nginx+uwsgi+django+virtualenv+supervisor发布web服务器(代码片段)

一.为什么要用nginx,uwsgi?11首先nginx是对外的服务接口,外部浏览器通过url访问nginx,232nginx接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户... 查看详情

瞬间心情愉悦,头发都少掉了几根!---django+uwsgi+nginx项目部署超详细步骤(代码片段)

文章目录瞬间心情愉悦,头发都少掉了几根!---Django+uwsgi+Nginx项目部署超详细步骤先决条件步骤本地运行测试上传服务器环境安装准备django程序完美解决!瞬间心情愉悦,头发都少掉了几根!—Django+u... 查看详情

技术博客django+uginx+uwsgi框架的服务器部署(代码片段)

...为云服务器为ubuntu16.04版本,先安装python和pip。然后安装django,注意安装版本要和本地测试的django版本一致,下面以2.0为例pip3installdjango2.0安装nginxsudoapt-getupdatesud 查看详情

uwsgi启动django项目时:unabletoloadapp0(mountpoint='')(callablenotfoundorimporterror)*(代码片段)

说起来有点坑用命令都能正常启动,但是用配置文件就是不行提示unabletoloadapp0(mountpoint=‘‘)(callablenotfoundorimporterror)***noapploaded.goinginfulldynamicmode***最后准备睡觉了了,无意间解决了uwsgi.ini文件的wsgi模块是这样写的,一直报错,... 查看详情

在centos7下从零搭建nginx+uwsgi+django(代码片段)

一、安装Python3   在centos7中系统自带Python2.7,需要自己安装Python3   1、安装依赖sudoyuminstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-devellibffi-develgccmake  2、安装wgetsudoyuminstallwge 查看详情