问题简介

我写爬虫,用到了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的更多相关文章

  1. 在docker中运行ASP.NET Core Web API应用程序

    本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过程中,也会对docker的使用进行一些简单的描述.对于.NET Cor ...

  2. .NET Core Web 应用部署到 Docker 中运行

    环境介绍 : 虚拟机:VirtualBox 5.1.6 系 统:Ubuntu 16.04.1 LTS 系统准备完成后可以使用 sudo apt-get udpate 和 sudo apt-get up ...

  3. docker中运行ASP.NET Core Web API

    在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...

  4. ASP.NET Core 网站在Docker中运行

    Docker作为新一代的虚拟化方式,未来肯定会得到广泛的应用,传统虚拟机的部署方式要保证开发环境.测试环境.UAT环境.生产环境的依赖一致性,需要大量的运维人力,使用Docker我们可以实现一次部署, ...

  5. 在Docker中运行EOS(MAC版)

    在Docker中运行EOS(MAC版) 在Docker中也可以简单快速的构建EOS.IO.笔者在Mac平台下参考官方文档躺了一次河.记录如下: 安装依赖 Docker 版本 17.05或者更高 tes ...

  6. 在Docker中运行纸壳CMS并配置使用MySql

    纸壳CMS是基于ASP.Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. GitHub:https://github.com/ ...

  7. 记一次Docker中部署Asp.Net Core 3.0的踩坑过程

    最近公司打算重构目前直销报单系统到微信小程序中,目前的系统只能在PC上面使用,这两年也搞过App端,但是由于人员流动和公司架构调整最后都不了了之,只留下一堆写了一半的接口.以前的接口依然是使用Asp. ...

  8. 在Docker中运行gocd

    gocd是一个持续集成的工具,可视化效果非常好 运行gocd-server 12345 docker run -d --name server -p8153:8153 -p8154:8154 -v / ...

  9. k3d入门指南:在Docker中运行K3s

    在本文中,我们将简单了解k3d,这是一款可让您在安装了Docker的任何地方运行一次性Kubernetes集群的工具,此外在本文中我们还将探讨在使用k3d中可能会出现的一切问题. 什么是k3d? k3 ...

随机推荐

  1. 数据库连接 UnicodeEncodeError: 'latin-1' codec can't encode character u'\u4eac' in position 0: ordinal not in range(256),UnicodeEncodeError: 'latin-1' codec can't encode character

    处理方法就是,设置连接和游标的charset为你所希望的编码,如utf8, 连接数据库的时候加上   charset="utf8 db = MySQLdb.connect(host= '14 ...

  2. Mysql时间存储类型优缺点?DATETIME?TIMESTAMP?INT?

    TIMESTAMP 4个字节储存;值以UTC格式保存;.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区. DATETIME 8个字节储存;实际格式储存;与时区无关;datetime  ...

  3. 相似微信的ChattingUi

    先看主页面布局 activity_imitate_weixin_main.xml <RelativeLayout xmlns:android="http://schemas.andro ...

  4. C数据结构-栈和队列,括号匹配举例---ShinePans

    1.栈和队列是两种特殊的线性表             运算操作被限定仅仅能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构 ...

  5. nginx在用户使用ie的使用重定向到/nginx-MSIE目录下

    [root@web01 ]# cat /app/server/nginx/conf/rewrite/default.conf #rewrite ^/index\.html /index.php las ...

  6. tomcat开启https协议

    1.在tomcat的conf/server.xml 中配置 <Connector port="443" protocol="org.apache.coyote.ht ...

  7. Wireshark-TCP协议分析(包结构以及连接的建立和释放)

    原文:http://blog.csdn.net/ahafg/article/details/51039584 TCP:传输控制协议 TCP是一种面向连接的.可靠的.基于字节流的传输层通信协议.  面向 ...

  8. 基于jQuery动画二级下拉导航菜单

    春节回来给大家分享一款基于jQuery动画二级下拉导航菜单.鼠标经过的时候以动画的形式出现二级导航.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id=" ...

  9. CentOS 7 上systemctl 的用法

    我们对service和chkconfig两个命令都不陌生,systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体. systemctl is-enable ...

  10. linux使用ip能ping通,但使用域名却不能访问的解决方法

    使用命令:yum -y update进行更新测试,一般测试结果为couldn't resolve hostmirrors.aliyun.com 解决方式参考博客couldn't resolve hos ...