django问题研讨:由master=true引发的奇怪现象
原实现方案
在task.py
设计一个类Reservation_Queue
负责管理任务队列,类成员self.queue
是存放任务的队列,self.nowtask
是存放正在执行任务。类方法有self.addsearchtask()
用于产生一个搜索任务到self.queue
队列内,self.__loop()
用于监视queue队列内的内容,self.main()
负责启动self.__loop()
的线程。
# file: task.py
class Reservation_Queue(object):def __init__(self, maxsize):self.queue = Queue(maxsize=maxsize) #存放任务的队列self.nowtask = None #存放正在执行的任务self.Lock_addtask = threading.Lock()def addsearchtask(self, queryset): #产生一个任务到queueresult = (False, 'None')try:self.Lock_addtask.acquire()self.queue.put(('search', queryset))result = (True, '已添加到任务队列!')except Exception as e:result = (False, json.dumps(e.args, indent=4))finally:print('addsearchtask', self.queue.queue, id(self.queue))self.Lock_addtask.release()return resultdef __loop(self): #死循环监视self.queue队列里的内容while True:print(time.time(), 'task_looping...', self.queue.queue, id(self.queue))if not self.queue.empty() and self.nowtask is None:self.nowtask = self.queue.get()if self.nowtask[0] == 'search':print('task_search')time.sleep(0.1)def main(self): #开启self.__loop线程,实时监视队列任务。print('task_thread_start')threading.Thread(daemon=True, target=self.__loop).start()task_reservation = Reservation_Queue(0)
task_reservation.main()
使用uwsgi部署到服务器
[uwsgi]
chdir = /www/wwwroot/ihgmiddleman/ihgmiddleman
wsgi-file = ihgmiddleman/wsgi.py
processes = 1
threads = 1
pidfile = myuwsgi.pid
master = true #注意这个master=true,就是由它引发的血案
socket = 127.0.0.1:8003
由master=true引发的奇怪现象
先通过执行self.addsearchtask()
后让self.queue
任务队列产生一个任务,并且打印出来addsearchtask deque([('search', <QuerySet [<Reservation: 22247819>]>)]) 140290378282176
,
后面的140290378282176
为self.queue
的地址,通过打印内容,可以看出任务已经成功的put入到self.queue
里面。
!!但是奇怪的事情发生了,在
self.__loop()
死循环内,监视到的self.queue
内容居然是空的,但是打印出来的id(self.queue)
是一致的,也是地址相同140290378282176
,但为什么会出现这一个奇怪的现象。
尝试解决问题
由于我在admin.py
与views.py
开头都同时写上了from reservation.task import task_reservation
,在猜想是否由于两个文件同时import
,导致task_reservation
指向的地址是不同的,于是我对这两个文件分别加入了print('admin.py', id(task_reservation))
和print('views.py', id(task_reservation))
。
# file: admin.py片段
...
from reservation.task import task_reservation
print('admin.py', id(task_reservation))
...
# file: views.py片段
...
from reservation.task import task_reservation
print('views.py', id(task_reservation))
...
但是事实告诉我,这样的写法是没有错误的,
from reservation.task import task_reservation
并不会为task_reservation
重新分配一个新地址,而会直接指向task.py
内task_reservation
的地址:140080990537808
。
"死马当活马"解决问题
排除以上地址问题以后,我把矛头指向了uwsgi的配置文件,随手把master=true
改成master=false
,以上问题竟完美解决!
可以看到执行
self.addsearchtask()
后,跟着后面的task_looping...
的队列内容也被正常的打印出来并且能输出打印task_search
。
问题与疑惑总结
这个问题就这样抱着疑惑解决了,但是为什么
master=true
会引发在线程内访问类成员失败,即访问self.queue
的内容居然是空列表,这个让我百思不得其解。master=false
之后问题竟就完美解决。
如果有知道的小伙伴,能在评论下面回答一下,解答我的疑惑吗??
django问题研讨:由master=true引发的奇怪现象相关推荐
- 简单说 !![]==true 与 []==true 引发的思考 1
说明 直接说出问题 !![] == true //结果是true [] == true //结果是false ![] == [] //结果是true 为什么会出现这种情况 解释 首先说一下,如果你看到 ...
- 记录一次@Accessors(chain = true) 引发的BeanUtils的反射问题
环境:JDK7,tomcat7 问题:bean对象使用了@Accessors(chain = true) 注解, 在调用BeanUtils.setProperty(t, field.getName() ...
- fgo梅林服务器维护,FGO:梅林池抽卡引发退游现象 国服没强卡真的不能玩?
大家所期待的梅林卡池终于在昨天维护以后正式登录国服FGO,梅林作为FGO第一强卡的存在使得其拥有很多强度党拥趸者,因为其"拐"的属性对于红卡英灵来说具有极大的提升,所有亦在所有国服 ...
- nginx+uwsgi+django1.9+mysql+python2.7部署到CentOS6.5
一.相关版本介绍 名称 说明 服务器 CentOS6.5 nginx 1.12.1 python 2.7.13 django 1.9 mysql 5.5.32 uwsgi 2.0.15 下面介绍一下我 ...
- ai人工智能_对人工智能的追求
ai人工智能 "Artificial Intelligence began with an ancient wish to forge the Gods." -Pamela McC ...
- Task 4: Contextual Word Embeddings
Contextual Word Embeddings 最想学习哪些内容,汇总如下: 变压器 (Transformers) BERT 问题解答 (QA) 文本生成和摘要 预训练的词向量:早年的Collo ...
- linux之排序sort命令详解
linux之排序sort命令 sort排序规则: 以行为单位,每一行作为一个字符串 按照字符串的比较规则,首字母开始依次向后按ASCII码值进行比较 结果默认升序输出 1. 简单排序 [root@li ...
- Django 1.6 部署
2019独角兽企业重金招聘Python工程师标准>>> 准备工作 首先,将 settings.py 内的 DEBUG 和 TEMPLATE_DEBUG 项设为 False. 然后,在 ...
- nginx+uWSGI + django部署项目
项目部署 nginx+uWSGI + django 1. WSGI WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器(返回静态资源的就是web服务器,Nginx)如何与Web应用程序( ...
最新文章
- XAMPP 相关设置(linux下的)
- MapReduce学习总结之Combiner、Partitioner、Jobhistory
- C++ - 编写一个从字符串转变成长整型的函数
- Java虚拟机学习 - 类加载器(ClassLoader)
- 设定网页最小最大宽度和高度(兼容IE6)
- VS设置DLL所在的调试目录
- dji大疆机器人冬令营_2019RoboMaster高中生机器人冬令营火热进行中
- 后 BERT 时代的那些 NLP 预训练模型
- boost::leaf模块读取缓冲区中的文本文件并将其打印到 std::cout
- 【学时总结模板时间】◆学时·10 模板·3◆ AC自动机
- 手语识别_如何使用转移学习进行手语识别
- Windows7和Ubuntu9.10完美硬盘安装(2)
- Yalmip最优化求解器+matlab | 教程(一)
- 微信公众号推送模板信息
- Jmeter测试脚本编写详解(配详图)
- 冷热分离和直接使用大数据库_【TBase开源版测评】深度测评TBase的shard分片和冷热分离存储特性...
- java实现面向对象的23种设计模式【超长预警,读完超过2小时】
- 英语日常短语积累(1)
- [CVPR2022]3D Photo Stylization: Learning to Generate Stylized Novel Views from a Single Image
- android画笔大小,android之画板功能之橡皮擦 画笔大小和画笔颜色