python中的多线程详解(python多线程抽象编程模型详解)
类别:脚本大全 浏览量:1664
时间:2022-01-19 00:57:49 python中的多线程详解
python多线程抽象编程模型详解最近需要完成一个多线程下载的工具,对其中的多线程下载进行了一个抽象,可以对所有需要使用到多线程编程的地方统一使用这个模型来进行编写。
主要结构:
1、基于Queue标准库实现了一个类似线程池的工具,用户指定提交任务线程submitter与工作线程worker数目,所有线程分别设置为后台运行,提供等待线程运行完成的接口。
2、所有需要完成的任务抽象成task,提供单独的无参数调用方式,供worker线程调用;task以生成器的方式作为参数提供,供submitter调用。
3、所有需要进行线程交互的信息放在context类中。
主要实现代码如下:
|
#Submitter线程类实现,主要是`task_generator`调用 class SubmitterThread(threading.Thread): _DEFAULT_WAIT_TIMEOUT = 2 #seconds def __init__( self , queue, task_gen, timeout = 2 ): super (SubmitterThread, self ).__init__() self .queue = queue if not isinstance (timeout, int ): _logger.error( 'Thread wait timeout value error: %s, ' 'use default instead.' % timeout) self .timeout = self ._DEFAULT_WAIT_TIMEOUT self .timeout = timeout self .task_generator = task_gen def run( self ): while True : try : task = self .task_generator. next () self .queue.put(task, True , self .timeout) except Queue.Full: _logger.debug( 'Task queue is full. %s wait %d second%s timeout' % ( self .name, self .timeout, 's' if ( self .timeout > 1 ) else '')) break except (StopIteration, ValueError) as e: _logger.debug( 'Task finished' ) break |
|
#Worker线程实现,主要就是try块内的func调用 class WorkerThread(threading.Thread): _DEFAULT_WAIT_TIMEOUT = 2 #seconds def __init__( self , queue, timeout = 2 ): super (WorkerThread, self ).__init__() self .queue = queue if not isinstance (timeout, int ): _logger.error( 'Thread wait timeout value error: %s, ' 'use default instead.' % timeout) self .timeout = self ._DEFAULT_WAIT_TIMEOUT self .timeout = timeout def run( self ): while True : try : func = self .queue.get( True , self .timeout) except Queue.Empty: _logger.debug( 'Task queue is empty. %s wait %d second%s timeout' % ( self .name, self .timeout, 's' if ( self .timeout > 1 ) else '')) break if not callable (func): time.sleep( 1 ) try : func() except Exception as e: _logger.error( 'Thread %s running occurs error: %s' % ( self .name, e)) print ( 'Thread running error: %s' % e) |
|
class Executor( object ): """ The really place to execute executor """ thread_list = [] submitters = 0 workers = 0 queue = None task_generator = None timeout = 0 def __init__( self , task_gen, submitters = 1 , workers = 1 , timeout = 2 ): if len ( self .thread_list) ! = 0 : raise RuntimeError( 'Executor can only instance once.' ) self .queue = Queue.Queue(maxsize = submitters * 2 + workers * 2 ) self .submitters = submitters self .workers = workers self .task_generator = task_gen self .timeout = timeout def start( self ): for i in range ( self .submitters): submitter = SubmitterThread( self .queue, self .task_generator, self .timeout) self .thread_list.append(submitter) submitter.setName( 'Submitter-%d' % i) submitter.setDaemon( True ) submitter.start() for i in range ( self .workers): worker = WorkerThread( self .queue, self .timeout) self .thread_list.append(worker) worker.setName( 'Worker-%d' % i) worker.setDaemon( True ) worker.start() def is_alive( self ): alive = False for t in self .thread_list: if t.isAlive(): alive = True break return alive def wait_to_shutdown( self ): _logger.debug( 'Start to wait to shutdown' ) for t in self .thread_list: t.join() _logger.debug( 'Shutdown thread : %s' % t.name) |
Executor类保存了线程池,提供相应接口。有了这个抽象之后,只需要实例化Executor类的对象,然后调用start方法进行多线程任务的运行。并可以用is_alive等接口再主线程内进行其他处理。
后续再使用这个抽象进行实际多线程任务的实现。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/u010487568/article/details/52081875
您可能感兴趣
- vscode如何配置python环境(VSCode Python开发环境配置的详细步骤)
- python最基本的编程工具(5款Python程序员高频使用开发工具推荐)
- python配合docker(Docker构建python Flask+ nginx+uwsgi容器)
- 如何查看python是否安装selenium(selenium+python截图不成功的解决方法)
- python线程池如何实现同步(Python mutiprocessing多线程池pool操作示例)
- python一分钟认识条件判断(对python判断ip是否可达的实例详解)
- python实现linux服务(Python实现Linux监控的方法)
- python批量自动化访问网站(python 自动批量打开网页的示例)
- python语言支持多态(Python实现多态、协议和鸭子类型的代码详解)
- python中pip和pip3有什么区别(ISAPI-REWRITE伪静态规则写法以及说明)
- python表白代码演示(python3实现表白神器)
- python的基本函数及用法(Python3.6.x中内置函数总结及讲解)
- python闭包的讲解(详解python函数的闭包问题内部函数与外部函数详述)
- linux下python安装pip(在Docker中的ubuntu中安装Python3和Pip的问题)
- python抓取贴吧标题和图片代码(Python实现的爬取百度贴吧图片功能完整示例)
- python常用的切片操作(使用python PIL库实现简单验证码的去噪方法步骤)
- 《刘老根3》热播,去世15年的她却再次被 伤害(去世15年的她却再次被)
- 十二星座爱情支配欲指数(十二星座爱情支配欲指数)
- 虐待儿童是发泄支配欲的愚蠢行为(虐待儿童是发泄支配欲的愚蠢行为)
- 你或许不知道你隐藏的支配欲望(你或许不知道你隐藏的支配欲望)
- 把宽体丰田86卖了,换成7.5代高尔夫GTI玩起姿态与性能并存的改装(把宽体丰田86卖了)
- 大众推出了第五代高尔夫GT(大众推出了第五代高尔夫GT)
热门推荐
- docker默认网桥设置(Docker默认网段修改实现方法解析)
- myeclipse连接mysql数据库的方法(教你用eclipse连接mysql数据库)
- mysql insert into 怎么用(MySQL中INSERT的一般用法)
- vue引入axios(vue封装axios的几种方法)
- python如何使用multiprocess(Python multiprocessing多进程原理与应用示例)
- vue的路由模式有几种(Vue 路由返回恢复页面状态的操作方法)
- mysql查询时间格式化(MySQL时间格式化)
- python中的pass是干嘛的(总结python中pass的作用)
- mysqlinnodb有什么功能(Mysql技术内幕之InnoDB锁的深入讲解)
- mysql中修改表的字段名(MySQL 使用SQL语句修改表名的实现)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9