thread.event说明
Python中的threading.Event()操控多线程的过程有:
- 定义事件:man_talk_event = threading.Event()
- 创建线程,传入对应事件:t1 = threading.Thread(target=man, args=(man_talk_event,), name='man')
- 查看对应事件的标志:man_talk_event.is_set()
返回Ture或False
- 阻塞对应事件线程:man_talk_event.wait()
如果事件标志为True则不阻塞
- 继续对应事件线程:man_talk_event.set()
设置事件标志为True
- 结束对应事件线程:man_talk_event.clear()
设置事件标志为False
- 注意创建线程的时候,如果之前设置成t1.setDaemon(True),则不会阻塞主线程
threading.Event机制类似于一个线程向其它多个线程发号施令的模式,其它线程都会持有一个threading.Event的对象,这些线程都会等待这个事件的“发生”,如果此事件一直不发生,那么这些线程将会阻塞,直至事件的“发生”。
对此,我们可以考虑一种应用场景(仅仅作为说明),例如,我们有多个线程从rabbitmq队列中读取数据来处理,这些线程都要尝试去连接rabbitmq的服务,一般情况下,如果Redis连接不成功,在各个线程的代码中,都会去尝试重新连接。如果我们想要在启动时确保rabbitmq服务正常,才让那些工作线程去连接Redis服务器,那么我们就可以采用threading.Event机制来协调各个工作线程的连接操作:主线程中会去尝试连接rabbitmq服务,如果正常的话,触发事件,各工作线程会尝试连接rabbitmq服务。
1、日志的配置文件log/test.log
[log]
name = 'nova'
# support notset debug info warning error critical
level= debug
log_file = E:\workspace\django_flow\log\test.log
2、方便使用log日志,写一个函数接口给其他人方便调用log/log.py
# author:wanstack
import logging
import configparser def log(name,level,log_file):
# 创建一个logger对象
logger = logging.getLogger(name)
# 设置日志级别
log_level = getattr(logging,level.upper())
logger.setLevel(log_level)
# 创建format日志格式
formatter = logging.Formatter('%(asctime)s -- %(name)s -- %(levelname)s -- %(message)s')
# 创建输出流
fn = logging.FileHandler(log_file)
# 添加formatter日志格式到输出流中
fn.setFormatter(formatter)
# 创建filter,并作用在输出流上
filter = logging.Filter(name)
fn.addFilter(filter)
# 将logger对象关联到输出流上
logger.addHandler(fn)
return logger # if __name__ == '__main__':
# cf = configparser.ConfigParser()
# cf.read('log.conf')
# name = cf.get('log', 'name')
# level = cf.get('log', 'level')
# log_file = cf.get('log', 'log_file')
# logger = log(name,level,log_file)
3、连接rabbitmq,如果连接不上就一直发日志,如果连接上了就退出other/test.py
# author:wanstack
import pika
import socket
import threading
import time
from log.log import log
import configparser
import os
RabbitmqHost = '172.20.6.184'
RabbitmqPort = 5672
RabbitmqUser = 'admin'
RabbitmqPwd = 'admin' def check_rabbitmq_port(RabbitmqHost,RabbitmqPort):
"""
检查rabbitmq端口是否存活
:param RabbitmqHost:
:param RabbitmqPort:
:return: 如果存活返回true,否则返回None
"""
# AF_INET ipv4
# SOCK_STREAM TCP
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 设置超时时间
sock.settimeout(1)
try:
sock.connect((RabbitmqHost,RabbitmqPort))
return True
except Exception:
logger.error('Server port {RabbitmqPort} not connect!'.format(RabbitmqPort=RabbitmqPort))
sock.close() def worker(event):
# 查看对应事件的标志,返回Ture或False
while not event.is_set():
logger.debug('Waiting for rabbitmq redy')
"""
我们在工作线程中加入了一个while循环,直到rabbitmq_ready事件触发之后才会结束循环,
wait方法调用会在1秒的超时后返回,这样,
我们就可以看到各个工作线程在系统启动的时候等待redis_ready的同时,
会记录一些状态信息。以下是这个程序的运行结果
"""
event.wait(1)
# 当事件标志为true时,才执行下面的内容,否则一直阻塞在event.wait上
logger.debug('rabbitmq ready, and connect to rabbitmq server and do some work [%s]', time.ctime())
credentials = pika.PlainCredentials(RabbitmqUser,RabbitmqPwd)
connection = pika.BlockingConnection(pika.ConnectionParameters(host=RabbitmqHost,credentials=credentials)) if __name__ == "__main__":
# 解析log配置文件,获取logger对象
cf = configparser.ConfigParser()
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
log_conf = os.path.join(BASE_DIR,'log\log.conf')
cf.read(log_conf)
name = cf.get('log', 'name')
level = cf.get('log', 'level')
log_file = cf.get('log', 'log_file')
logger = log(name,level,log_file)
rabbitmq_ready = threading.Event()
t1 = threading.Thread(target=worker,args=(rabbitmq_ready,),name='t1')
t1.start()
t2 = threading.Thread(target=worker,args=(rabbitmq_ready,),name='t2')
t2.start()
logger.debug('first of all, check rabbitmq server, make sure it is OK, and then trigger the rabbitmq ready event') # 检测rabbitmq-server端口是否存活
check_port = check_rabbitmq_port(RabbitmqHost, RabbitmqPort)
if check_port:
rabbitmq_ready.set()
thread.event说明的更多相关文章
- 线程 Thread类 GIL锁 信号量 Event事件
线程的开启方法 进程是操作系统调度的最小单位,一个进程最少有一个主线程,而一个进程中可以开启多个线程 from threading import Thread def task(): print('A ...
- Event&Condition pyton
Event 一个线程需要根据另外一个线程的状态来确定自己的下一步操作,需要调用threading库中Event对象:Event包含一个可由线程设置的信号标志,在初始情况下,event对象的标志位为假( ...
- python多线程之Event(事件)
#!/usr/bin/env python # -*- coding: utf-8 -*- import time from threading import Thread, Event import ...
- quagga源码分析--通用库thread
quagga是开源路由器软件,提供的用户界面与思科,华为的路由器的人机接口几乎一致,非常有学习价值,尤其是开源的协议代码,简直亮瞎了我的小眼睛. quagga的介绍,我就不赘述了,有兴趣的可以找度娘或 ...
- event模拟数据库链接
from threading import Thread,Event,currentThread import time e = Event() def conn_mysql(): count = 1 ...
- day 7-6 GIL,死锁,递归锁与信号量,Event,queue,
摘要: 1.死锁与递归锁 2.信号量 3.Event 4.Timer 5.GIL 6.Queue 7.什么时候该用多线程和多进程 一. 死锁与递归锁 所谓死锁: 是指两个或两个以上的进程或线程在执行过 ...
- 第四十一天 socker server和 event
今日内容 1.基于TCP的socketserver 2.基于UDP的socketserver 3.event 一.TCP的socketserver #服务器 import socketserver f ...
- python全栈开发 * 线程锁 Thread 模块 其他 * 180730
一,线程Thread模块1.效率更高(相对于进程) import time from multiprocessing import Process from threading import Thre ...
- socketserver及相关的类 (处理socket服务端)+ event事件的使用
编写简单的套接字服务器并不难,然而,如果要创建的并非简单服务器,还要求助于服务器模块. 模块SocketServer是标准库提供的服务器框架的基石,这个框架包括好多服务器,他们基本服务器的基础上添加了 ...
随机推荐
- Monte Carlo methods
Monte Carlo methods https://zh.wikipedia.org/wiki/蒙地卡羅方法 通常蒙地卡羅方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机 ...
- vsftpd文件服务器安装与配置
-d<登入目录>:指定用户登入时的启始目录:. -s<shell>:指定用户登入后所使用的shell: /sbin/nologin指的是不允许login当前Linux系统.当用 ...
- C#基础整理(一)
1.什么是.net? .net有.net平台和.Net Framework框架. .net平台是包含.net framework框架. framework框架提供稳定的运行环境来保证基于.Net平台开 ...
- 系统管理命令之tty
在Linux操作系统中,所有外围设备都有其名称与代号,这些名称代号以特殊文件的类型存放于/dev目录下.你可以执行tty指令查询目前使用的终端机的文件名称. 1.命令帮助: # tty -- help ...
- c++第二十五天
p129~p131: 1.赋值运算的左侧运算对象必须是一个可修改的左值. 2.赋值运算满足右结合律. 3.赋值运算的结果是它的左侧对象,并且是一个左值. 验证: #include<iostrea ...
- MySQL中的索引的引用
博文首先说明索引的分类及创建,然后会涉及到索引的可用性选择以及索引的优化. 索引是什么?先说创建索引的目的,创建索引是为提高对数据的查询速度.在字典的目录中,我们可以很快找到某个字的位置,索引的作用就 ...
- 微信小程序:WXSS 样式
微信小程序:WXSS 样式 一.WXSS 样式 XSS 具有 CSS 大部分的特性,小程序在 WXSS 也做了一些扩充和修改. 1,新增了尺寸单位: 在写 CSS 样式时,开发者需要考虑到手机设备的屏 ...
- 微信小程序:WXML 模板
微信小程序:WXML 模板 一.WXML 模板 网页编程采用的是 HTML + CSS + JS 这样的组合,其中 HTML 是用来描述当前这个页面的结构,CSS 用来描述页面的样子,JS 通常是用来 ...
- DigitalOcean(edu用户)搭建VPS
免费上网FQ edu福利 edu邮箱 VPS VPN 1 申请 目的:利用edu邮箱的优惠获得digitalocean一年vpn,可以FQ或者免流. 1.1 准备工作 百度“github大礼包”,浏览 ...
- POJ 2923 Relocation(状压DP+01背包)题解
题意:给你汽车容积c1,c2,再给你n个包裹的体积,问你最少运几次能全运走 思路:用2进制表示每次运送时某物在不在此次运送之中,1在0不在.我们把运送次数抽象成物品价值,把状态抽象成体积,用一个dp[ ...