原实现方案

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
后面的140290378282176self.queue的地址,通过打印内容,可以看出任务已经成功的put入到self.queue里面。

!!但是奇怪的事情发生了,在self.__loop()死循环内,监视到的self.queue内容居然是空的,但是打印出来的id(self.queue)是一致的,也是地址相同140290378282176,但为什么会出现这一个奇怪的现象。

尝试解决问题

由于我在admin.pyviews.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.pytask_reservation的地址:140080990537808

"死马当活马"解决问题

排除以上地址问题以后,我把矛头指向了uwsgi的配置文件,随手把master=true改成master=false,以上问题竟完美解决!

可以看到执行self.addsearchtask()后,跟着后面的task_looping...的队列内容也被正常的打印出来并且能输出打印task_search

问题与疑惑总结

这个问题就这样抱着疑惑解决了,但是为什么master=true会引发在线程内访问类成员失败,即访问self.queue的内容居然是空列表,这个让我百思不得其解。master=false之后问题竟就完美解决。
如果有知道的小伙伴,能在评论下面回答一下,解答我的疑惑吗??

django问题研讨:由master=true引发的奇怪现象相关推荐

  1. 简单说 !![]==true 与 []==true 引发的思考 1

    说明 直接说出问题 !![] == true //结果是true [] == true //结果是false ![] == [] //结果是true 为什么会出现这种情况 解释 首先说一下,如果你看到 ...

  2. 记录一次@Accessors(chain = true) 引发的BeanUtils的反射问题

    环境:JDK7,tomcat7 问题:bean对象使用了@Accessors(chain = true) 注解, 在调用BeanUtils.setProperty(t, field.getName() ...

  3. fgo梅林服务器维护,FGO:梅林池抽卡引发退游现象 国服没强卡真的不能玩?

    大家所期待的梅林卡池终于在昨天维护以后正式登录国服FGO,梅林作为FGO第一强卡的存在使得其拥有很多强度党拥趸者,因为其"拐"的属性对于红卡英灵来说具有极大的提升,所有亦在所有国服 ...

  4. 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 下面介绍一下我 ...

  5. ai人工智能_对人工智能的追求

    ai人工智能 "Artificial Intelligence began with an ancient wish to forge the Gods." -Pamela McC ...

  6. Task 4: Contextual Word Embeddings

    Contextual Word Embeddings 最想学习哪些内容,汇总如下: 变压器 (Transformers) BERT 问题解答 (QA) 文本生成和摘要 预训练的词向量:早年的Collo ...

  7. linux之排序sort命令详解

    linux之排序sort命令 sort排序规则: 以行为单位,每一行作为一个字符串 按照字符串的比较规则,首字母开始依次向后按ASCII码值进行比较 结果默认升序输出 1. 简单排序 [root@li ...

  8. Django 1.6 部署

    2019独角兽企业重金招聘Python工程师标准>>> 准备工作 首先,将 settings.py 内的 DEBUG 和 TEMPLATE_DEBUG 项设为 False. 然后,在 ...

  9. nginx+uWSGI + django部署项目

    项目部署 nginx+uWSGI + django 1. WSGI WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器(返回静态资源的就是web服务器,Nginx)如何与Web应用程序( ...

最新文章

  1. XAMPP 相关设置(linux下的)
  2. MapReduce学习总结之Combiner、Partitioner、Jobhistory
  3. C++ - 编写一个从字符串转变成长整型的函数
  4. Java虚拟机学习 - 类加载器(ClassLoader)
  5. 设定网页最小最大宽度和高度(兼容IE6)
  6. VS设置DLL所在的调试目录
  7. dji大疆机器人冬令营_2019RoboMaster高中生机器人冬令营火热进行中
  8. 后 BERT 时代的那些 NLP 预训练模型
  9. boost::leaf模块读取缓冲区中的文本文件并将其打印到 std::cout
  10. 【学时总结模板时间】◆学时·10 模板·3◆ AC自动机
  11. 手语识别_如何使用转移学习进行手语识别
  12. Windows7和Ubuntu9.10完美硬盘安装(2)
  13. Yalmip最优化求解器+matlab | 教程(一)
  14. 微信公众号推送模板信息
  15. Jmeter测试脚本编写详解(配详图)
  16. 冷热分离和直接使用大数据库_【TBase开源版测评】深度测评TBase的shard分片和冷热分离存储特性...
  17. java实现面向对象的23种设计模式【超长预警,读完超过2小时】
  18. 英语日常短语积累(1)
  19. [CVPR2022]3D Photo Stylization: Learning to Generate Stylized Novel Views from a Single Image
  20. android画笔大小,android之画板功能之橡皮擦 画笔大小和画笔颜色

热门文章

  1. 应用商店-华为应用市场
  2. Web全栈工程师技能树梳理
  3. SIGIR'22 | 阿里 ESCM^2: 升级版全空间多任务转化率预估
  4. 关于美团、饿了么外卖优惠券公众号的设计思路
  5. NoScope:极速视频目标检测
  6. mybatis-plus lambda表达式学习笔记
  7. 用matlab画树叶,matlab画漂亮的树叶
  8. Spark大数据分析案例之平均心率检测[2021]
  9. 当遇到火狐浏览器“建立安全连接失败”问题,处理方法
  10. cdn连接失败是什么意思_CDN经常连接失败的原因有哪些?