记一个在docker中运行多线程event_loop.run_forever()的bug
问题简介
我写爬虫,用到了asyncio相关的事件循环,新建了一个线程去run_forever()
,在docker中运行。后来程序有异常,主线程挂了,但是竟然不报错。查了很久,才找出来。
如果你新建一个线程去运行一般的死循环,主线程出错退出,是会报错的,虽然子线程还会继续运行。
如果你新建一个线程去运行event_loop.run_forever()
,主线程出异常退出,没有任何错误提示,子线程一样继续运行。
解决办法
我查了很久也不知道为什么,在本地跑,一切正常。测试程序如下:
import asyncio
import logging
from threading import Thread
logging.basicConfig(level=logging.INFO, format='[%(asctime)s] - %(levelname)s in %(filename)s: %(message)s')
logger = logging.getLogger(__name__)
def start_loop(event_loop):
"""start run_forever"""
asyncio.set_event_loop(event_loop)
event_loop.run_forever()
def get_event_loop():
"""new and return event_loop"""
event_loop = asyncio.new_event_loop()
t0 = Thread(target=start_loop, args=(event_loop,))
t0.start()
return event_loop
if __name__ == '__main__':
loop = get_event_loop()
logger.info('make error')
raise TimeoutError('sfasf')
"""
[2019-04-16 13:40:46,101] - INFO in docker_test.py: make error
Traceback (most recent call last):
File "D:/Code/python/concurrent_crawler/test/docker_test/docker_test.py", line 38, in <module>
raise TimeoutError('sfasf')
TimeoutError: sfasf
"""
如果在docker中就没有任何错误提示,最后解决办法如下
import asyncio
import logging
from threading import Thread
logging.basicConfig(level=logging.INFO, format='[%(asctime)s] - %(levelname)s in %(filename)s: %(message)s')
logger = logging.getLogger(__name__)
def start_loop(event_loop):
"""start run_forever"""
asyncio.set_event_loop(event_loop)
event_loop.run_forever()
def get_event_loop():
"""new and return event_loop"""
event_loop = asyncio.new_event_loop()
t0 = Thread(target=start_loop, args=(event_loop,))
t0.setDaemon(True) # 随着主线程结束而结束
t0.start()
return event_loop
if __name__ == '__main__':
loop = get_event_loop()
logger.info('make error')
raise TimeoutError('sfasf')
利用线程的setDaemon(True)方法,结束子线程。这样才会输出出来!
这个问题我放到stackoverflow了link
记一个在docker中运行多线程event_loop.run_forever()的bug的更多相关文章
- 在docker中运行ASP.NET Core Web API应用程序
本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...
- .NET Core Web 应用部署到 Docker 中运行
环境介绍 : 虚拟机:VirtualBox 5.1.6 系 统:Ubuntu 16.04.1 LTS 系统准备完成后可以使用 sudo apt-get udpate 和 sudo apt-get up ...
- docker中运行ASP.NET Core Web API
在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...
- ASP.NET Core 网站在Docker中运行
Docker作为新一代的虚拟化方式,未来肯定会得到广泛的应用,传统虚拟机的部署方式要保证开发环境.测试环境.UAT环境.生产环境的依赖一致性,需要大量的运维人力,使用Docker我们可以实现一次部署, ...
- 在Docker中运行EOS(MAC版)
在Docker中运行EOS(MAC版) 在Docker中也可以简单快速的构建EOS.IO.笔者在Mac平台下参考官方文档躺了一次河.记录如下: 安装依赖 Docker 版本 17.05或者更高 tes ...
- 在Docker中运行纸壳CMS并配置使用MySql
纸壳CMS是基于ASP.Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. GitHub:https://github.com/ ...
- 记一次Docker中部署Asp.Net Core 3.0的踩坑过程
最近公司打算重构目前直销报单系统到微信小程序中,目前的系统只能在PC上面使用,这两年也搞过App端,但是由于人员流动和公司架构调整最后都不了了之,只留下一堆写了一半的接口.以前的接口依然是使用Asp. ...
- 在Docker中运行gocd
gocd是一个持续集成的工具,可视化效果非常好 运行gocd-server 12345 docker run -d --name server -p8153:8153 -p8154:8154 -v / ...
- k3d入门指南:在Docker中运行K3s
在本文中,我们将简单了解k3d,这是一款可让您在安装了Docker的任何地方运行一次性Kubernetes集群的工具,此外在本文中我们还将探讨在使用k3d中可能会出现的一切问题. 什么是k3d? k3 ...
随机推荐
- CentOS 安装 升级Firefox
把旧版本的firefox卸掉: # yum erase firefox 然后安装新版本: # yum firefox
- IIS6 伪静态 IIS文件类型映射配置方法 【图解】
1.右键点击 要设置网站的网站 2.属性 -->主目录 -->配置--> 3.如右侧窗口,找到 .aspx 扩展名-->编辑-->复制 可执行文件的路径-->关闭 ...
- Redis(十八):Redis和队列
概要 Redis不仅可作为缓存服务器,还可用作消息队列.它的列表类型天生支持用作消息队列.如下图所示: 由于Redis的列表是使用双向链表实现的,保存了头尾节点,所以在列表头尾两边插取元素都是非常快的 ...
- XVAG音频文件格式提取
索尼的一种游戏音频格式,通过vgmstream工具可以提取 工具已经下载好:(包含dll包) http://files.cnblogs.com/files/hont/vgmstream-r1040-t ...
- 【Android】15.3 Notification基础知识
分类:C#.Android.VS2015: 创建日期:2016-02-29 一.如何向用户发出通知 1.使用Toast通知用户 前台任务中的通知(Notifications)一般用于长时间显示用户正在 ...
- jquer WdatePicker 使用 手册
1. 跨无限级框架显示 无论你把日期控件放在哪里,你都不需要担心会被外层的iframe所遮挡进而影响客户体验,因为My97日期控件是可以跨无限级框架显示的 示例2-7 跨无限级框架演示 可无限跨越框架 ...
- LeetCode -- 推断链表中是否有环
思路: 使用两个节点.slow和fast,分别行进1步和2步.假设有相交的情况,slow和fast必定相遇:假设没有相交的情况,那么slow或fast必定有一个为null 相遇时有两种可能:1. 仅仅 ...
- Unix系统编程()进程和程序
进程(process)是一个可执行程序(program)的实例. 程序是包含了一系列信息的文件,这些信息描述了如何在运行时创建一个进程,所包括的内容如下所示. 二进制格式标识:每个程序文件都包含用于描 ...
- C语言 · 数对
算法训练 数对 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,该程序从用户读入一个整数,然后列出所有的数对,每个数对的乘积即为该数. 输入格式:输入只有一行, ...
- [system]c/c++调用cat命令
因为cat并不是一个带返回的命令,而是输出到标准输出.所以使用system("cat /sys/class/gpio/...."); 得不到我们想要的结果. 下面的/bin/ls同 ...