Python的定时器与线程池

定时器执行循环任务:

  • 知识储备
  1.   Timer(interval, function, args=None, kwargs=None)
  2. interval ===》 时间间隔 单位为s
  3. function ===》 定制执行的函数
  • 使用threading的 Timer 类
  1. start() 为通用的开始执行方法
  2. cancel ()为取消执行的方法
  • 普通单次定时执行
from threading import Timer
import time
# 普通单次定时器
def handle():
print("普通单次定时器 函数被执行");
t1=Timer(interval=1,function=handle);
t1.start();

定时循环执行

from threading import Timer
import time
# 循环定时器
def loop_handle():
print("循环定时器定时器 函数被执行");
global t2;
t2=Timer(interval=1,function=loop_handle);
t2.start();

t2=Timer(interval=1,function=loop_handle);
t2.start();

time.sleep(5);# 对主线程停止5s;
t2.cancel(); # t2 在主main 线程阻塞5s t2执行5s

  

线程池技术

基本概念

  • 在程序启动时就创建好若干个线程,并保存到内存中 。 当线程启动并执行完成之后,并不做销毁处理,而是等待下次再使用。

    i:节约了创建进程 销毁进程的时间,大大降低进程的开销

  • 实现
  1. 抢占式:线程池中的线程执行顺序不固定。该方式使用 ThreadPoolExecutor的 submit ()方法实现。

    1.       具体执行那个线程是随机的, 并且执行的函数也可以不一致
    2.   那个线程执行的函数出现了崩溃,不影响整个线程池的其他线程的运行
    3.   使用with 语法 进行简化操作
  • 非抢占式:线程将按照调用的顺序执行 。 此方式使用 ThreadPoolExecutor 的 map ()方法来实现
  1.   每个线程处理的函数都是一致的,一个线程执行的函数崩溃,整体就崩溃

基本code

from concurrent.futures import ThreadPoolExecutor # 导入线程池
import time

def printName(name):
print("名字",name);
time.sleep(2);
nameList=[‘Tom‘,‘jirl‘,‘steam‘];
# 抢占式线程池
start2=time.time();
with ThreadPoolExecutor(3) as executor:
for i in nameList:# 因为每次执行的函数不一致,所以参数要分开传递
executor.submit(printName,i);
end2=time.time();
print("2 speed:",str(end2-start2));
#非抢占式线程池

线程数量公式:
公式

经验
(1 )初始化一定数量的线程。
( 2 )在多次实验中递增或递减线程数量 ,测试运行性能 。
(3 )确定最忧 的线程数量。

原文地址:https://www.cnblogs.com/dgwblog/p/11517910.html

时间: 2024-10-29 13:40:30

Python的定时器与线程池的相关文章

Spring 定时器结合线程池

需求:Spring 定时器结合线程池处理工单 a.定时扫库查出一定数量的需要处理的工单 b.开启线程处理查出的工单 1,创建处理工单的task @Component("AppWorkOrderTask") @Scope("prototype") public class AppWorkOrderTask implements Runnable { public static final String BEAN_NAME = "AppWorkOrderTas

Python并发编程之线程池/进程池--concurrent.futures模块

h2 { color: #fff; background-color: #f7af0d; padding: 3px; margin: 10px 0px } 一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要编写自己的线程池/进程池,以空间换时间.但从Python3.2开始,标准库为我们提供了conc

python GIL锁 锁 线程池 生产者消费模型

python的GIL 锁 python内置的一个全局解释器锁 , 锁的作用就是保证同一时刻一个进程中只有一个线程可以被cpu调度 为什么有这把GIL锁? python语言的创始人在开发这门语言时 , 目的快速把语言开发出来 , 如果加上GIL锁(C语言加锁) , 切换时按照100条字节指令来进行线程间的切换 锁 : 1.锁 : Lock(1次放1个) 线程安全 , 多线程操作时 , 内部会让所有线程排队处理 , 如 : list / dict / Queue 线程不安全 + 人  =>排队处理

python(13)线程池:threading

先上代码: 1 pool = threadpool.ThreadPool(10) #建立线程池,控制线程数量为10 2 reqs = threadpool.makeRequests(get_title, data, print_result) #构建请求,get_title为要运行的函数,data为要多线程执行函数的参数 3 #最后这个print_result是可选的,是对前两个函数运行结果的操作 4 [pool.putRequest(req) for req in reqs] #多线程一块执行

Python练习【利用线程池爬取电影网站信息】

功能实现 爬取猫眼电影TOP100(http://maoyan.com/board/4?offset=90) 1). 爬取内容: 电影名称,主演, 上映时间,图片url地址保存到文件中; 2). 文件名为topMovie.csv; 3). 记录方式: 电影名称:主演:上映时间:图片url地址:评分; 4). 并爬取的信息保存在数据库中; 5). 使用多线程/线城池实现; 编程思路 1.利用多线程分配任务 2.编写单线程的任务实现功能 (1)获取指定url页面信息. (2)从指定信息中匹配所需的信

python D32 管道、线程池

管道: Pipe Conn1,conn2 = Pipe() 数据共享: M = Manager() Dic = m.dict({'name':sbalex}) 数据安全的问题 加锁 进程池   ***** Map:异步提交任务,参数是可迭代对象,自带close + join Apply :同步提交任务,直接可以收到返回值 Apply_async()  异步提交任务:res.get()  阻塞效果 Close join 回调函数:callback= 一.管道 进程间通信(IPC)方式二:管道(不推

Python之路:线程池

版本一 #!/usr/bin/env python# -*- coding:utf-8 -*-import Queueimport threading  class ThreadPool(object):     def __init__(self, max_num=20):        self.queue = Queue.Queue(max_num)        for i in xrange(max_num):            self.queue.put(threading.T

Python 线程池

python默认没有提供线程池的功能,所以要想使用线程池,就必要使用第三方的模块或者自定义线程 线程并不是越多越好,线程的上下文切换会影响到服务器的性能 线程池:一个容器,有最大数,取一个少一个,无线程时等待,线程执行完毕,交还线程 __author__ = 'alex' #coding:utf-8 import queue import threading import time class ThreadPool: def __init__(self,maxsize=5): self.maxs

Python:线程、进程与协程(7)——线程池

前面转载了一篇分析进程池源码的博文,是一篇分析进程池很全面的文章,点击此处可以阅读.在Python中还有一个线程池的概念,它也有并发处理能力,在一定程度上能提高系统运行效率:不正之处欢迎批评指正. 线程的生命周期可以分为5个状态:创建.就绪.运行.阻塞和终止.自线程创建到终止,线程便不断在运行.创建和销毁这3个状态.一个线程的运行时间可由此可以分为3部分:线程的启动时间.线程体的运行时间和线程的销毁时间.在多线程处理的情景中,如果线程不能被重用,就意味着每次创建都需要经过启动.销毁和运行3个过程