一日一技:Python多线程的事件监控

设想这样一个场景:

你创建了10个子线程,每个子线程分别爬一个网站,一开始所有子线程都是阻塞等待。一旦某个事件发生:例如有人在网页上点了一个按钮,或者某人在命令行输入了一个命令,10个爬虫同时开始工作。

肯定有人会想到用Redis来实现这个开关:所有子线程全部监控Redis中名为start_crawl的字符串,如果这个字符串不存在,或者为0,那么就等待1秒钟,再继续检查。如果这个字符串为1,那么就开始运行。

代码片段可以简写为:

import time

import redis

client = redis.Redis()

while client.get('start_crawl') != 1:

print('继续等待')

time.sleep(1)

这样做确实可以达到目的,不过每一个子线程都会频繁检查Redis。

实际上,在Python的多线程中,有一个 Event模块,天然就是用来实现这个目的的。

Event是一个能在多线程中共用的对象,一开始它包含一个为 False的信号标志,一旦在任一一个线程里面把这个标记改为 True,那么所有的线程都会看到这个标记变成了 True。

我们通过一段代码来说明它的使用方法:

import threading

import time

class spider(threading.Thread):

def __init__(self, n, event):

super().__init__()

self.n = n

self.event = event

def run(self):

print(f'第{self.n}号爬虫已就位!')

self.event.wait()

print(f'信号标记变为True!!第{self.n}号爬虫开始运行')

eve = threading.Event()

for num in range(10):

crawler = spider(num, eve)

crawler.start()

input('按下回车键,启动所有爬虫!')

eve.set()

time.sleep(10)

运行效果如下图所示:

在这段代码中,线程 spider在运行以后,会运行到 self.event.wait()这一行,然后10个子线程会全部阻塞在这里。而这里的 self.event,就是主线程中 eve=threading.Event()生成的对象传入进去的。

在主线程里面,当执行了 eve.set()后,所有子线程的阻塞会被同时解除,于是子线程就可以继续运行了。

kingname

攒钱给产品经理买房。

python线程监控配置文件_一日一技:Python多线程的事件监控相关推荐

  1. python延时执行函数_一日一技:在 Python 中实现延迟调用

    一日一技:在 Python 中实现延迟调用 收录于话题 #你不知道的 Python 71个 摄影:产品经理 产品经理的生日餐 熟悉 Golang 的同学都知道,Golang 里面有一个关键词叫做def ...

  2. python中timeit函数_一日一技:Python中的timeit方法

    timeit()方法 python中的timeit()方法, 它用于获取代码的执行时间.该库将代码语句运行一百万次,并提供从集合中花费的最短时间.这是一种有用的方法,有助于检查代码的性能. 语法如下: ...

  3. python 线程安全链表_教你用 Python 实现 HashMap 数据结构

    <犬夜叉·镜中的梦幻城> 今天这篇文章给大家讲讲hashmap,这个号称是所有Java工程师都会的数据结构.为什么说是所有Java工程师都会呢,因为很简单,他们不会这个找不到工作.几乎所有 ...

  4. python线程延时函数_延迟队列的python实现

    方案思路 1.利用优先级队列实现 2.利用redis的zset实现 3.利用rabbitmq超时TTL后的死信机制实现 4.通过threading.Timer()使用多线程解决需求.注:这不是延迟队列 ...

  5. python中不被定义_一日一技:在Python中双下划线私有方法不能被调用的原理

    一日一技:在Python中双下划线私有方法不能被调用的原理 在使用Python编写面向对象的代码时,我们会常常使用"继承"这种开发方式.例如下面这一段代码: class Info: ...

  6. python归并排序理解不了_一日一技:如何更好地理解归并排序?

    一日一技:如何更好地理解归并排序? 摄影:产品经理 厨师:kingname 请确保你已经看了我昨天的公众号文章.昨天的内容是今天的基础. 一日一技:在 Python 里面如何合并多个有序列表并使得结果 ...

  7. python模型预测结果 取整_一日一技:Python里面的//并不是做了除法以后取整

    一日一技:Python里面的//并不是做了除法以后取整 在Python 3里面,我们做除法的时候会遇到 a/b 和 a//b两种写法: >>> 10 / 3 3.3333333333 ...

  8. 一日一技python安装_一日一技:快速实现Python 命令行参数

    一日一技:快速实现Python 命令行参数 摄影:产品经理 厨师:kingname 我们有时候需要使用 Python 开发一些命令行工具,并在运行命令的时候指定一些参数,例如: python3 xxx ...

  9. python文本格式上一日_一日一技:在 Python 中快速遍历文件

    一日一技:在 Python 中快速遍历文件 摄影:产品经理 厨师:产品经理 当我们要在一个文件夹及其子文件夹里面寻找特定类型的文件,我们可能会这样写代码: 没有子文件夹时 import os all_ ...

最新文章

  1. 维特比算法—打字输入预测
  2. mysql 学习笔记05 统计函数的相关使用
  3. QuickSort 优化后的快速排序算法
  4. 给DataList分页有两个办法:1、自定义实现分页方法 2、用第三方控件(例如AspNetPager)
  5. 挂了三次科目二的我,竟被一台智能车征服 | 威马W6停车挑战
  6. C++_函数_函数的占位参数_函数重载---C++语言工作笔记034
  7. PDF文件的加载及展示
  8. java性能优化文章
  9. php二维数组按照键值排序的方法
  10. Win7无法正常使用TTS语音的解决办法
  11. CSS RESET —— 浏览器样式重置
  12. 小米路由器3潘多拉固件刷机教程
  13. 衣带渐宽终不悔,为“指针”消得人憔悴(三)
  14. 【毕业设计】大数据疫情数据分析及可视化系统 - python
  15. 微信小程序实现商品列表跳转详情页
  16. 操作系统基本原理---设备管理
  17. UDP攻击是什么意思?UDP攻击防范措施
  18. c语言随机抽取扑克问题,关于扑克牌的问题
  19. Python参数校验工具:validate.py
  20. 锂离子电池析锂原因总结

热门文章

  1. Python中的高级数据结构详解
  2. python基础对list的增删查改和列表的排序
  3. 排序算法的python实现
  4. Linux ubuntu16.04 安装opencv4教程(源码编译)
  5. win10如何关闭文件夹或者照片的最近浏览?
  6. yunyang1994 tensorflow_yolov3 ./checkpoint/yolo3_coco_demo.ckpt does not exist !!! Now it starts to
  7. 网络监听listen技术是什么原理?
  8. pycharm 怎么修改函数(变量)名及其引用?全局修改(批量重命名)(ctrl + f6)
  9. mysql 主从复制优化、并行复制
  10. linux——sshd服务及其管理命令