首页 > 其他分享 >使用ThreadPoolExecutor and schedule进行创建线程池(多线程-定时任务-数据同步-任务队列)

使用ThreadPoolExecutor and schedule进行创建线程池(多线程-定时任务-数据同步-任务队列)

时间:2023-01-08 14:11:27浏览次数:47  
标签:schedule 任务 every time print 线程 多线程

使用ThreadPoolExecutor and schedule进行创建线程池(多线程-定时任务-数据同步-任务队列)

# 使用ThreadPoolExecutor and schedule进行创建线程池(多线程-定时任务-数据同步-任务队列)
from concurrent.futures import ThreadPoolExecutor#导入线程池库
import threading#导入线程库
import time#导入时间库
import schedule#导入调度库——定时
import random#随机数生成库引入
# --------------------------------------------------------------
# 定义一个任务函数(求和),用来多线程执行测试
def task(n):#这是一个作业函数,去执行任务的函数
    time.sleep(3)#让程序休眠3秒
    sum=0
    for i in range(n+1):#求和
        sum =sum+i
    # print(threading.current_thread().name,n,"的和为:",sum)#threading.current_thread().name可以获取到当前线程名称
    return str(n) + '的求和为:' + str(sum)#将执行结果返回
# --------------------------------------------------------------
# 创建一个函数任务(添加任务),用来向线程池的队列中【添加新任务】。
def addtask():#将task任务添加到线程池的队列中
    for i in range(5):#创建十个任务
        future1 = pool.submit(task, i)#将task任务【添加至线程池的队列中】
        threadlist.append(future1)#将线程对象放到列表中,便于【二次调用】
    for th in threadlist:#遍历线程对象
        print(th.result())#调用任务线程,获取任务执行完毕返回的【结果】
    # 清空列表,会变成[]
    threadlist.clear()
# --------------------------------------------------------------
# 创建一个函数任务(死循环-调用添加任务函数):子线程执行该函数,进入死循环中,间断执行添加任务函数。
def queue01():
    while(True):#设立死循环,不让线程死亡,间断执行方法体的程序。
        addtask()#调用添加任务函数
        print('休眠3秒钟~')#向控制台打印日志
        try:
            time.sleep(3)#让程序休眠3秒
        except:
            pass#异常不执行,直接跳过(相当于空语句)
# --------------------------------------------------------------
#创建一个函数任务,用来子线程测试用,【仅有测试用途,无涉及其他内容调用】
def test(n):
    print(threading.current_thread().name,n)
# @@@【分隔符】-------------------------------------------------------------------------------
# 以上函数的实现与下列的函数功能相同,可以只看下面(或者看上面)的函数即可实现功能。建议看下面的较简单好理解。
# @@@---------------------------------------------------------------------------------------

# 线程同步~
def addvalue():
    lock.acquire()# 操作共享数据前,申请获取锁
    threadlist.append(int(random.random()*100))
    lock.release()# 操作完共享数据后,申请释放锁
# --------------------------------------------------------------
def job01():#定时执行-作业1
    print("I'm working...job01",threading.current_thread().name)
    addvalue()
    print(threadlist)
    time.sleep(1)
# --------------------------------------------------------------
def job02():#定时执行-作业2
    print("I'm working...job02",threading.current_thread().name)
    addvalue()
    print(threadlist)
    time.sleep(1)
# --------------------------------------------------------------
def job03():#定时执行-作业3
    print("I'm working...job03",threading.current_thread().name)
    addvalue()
    print(threadlist)
    time.sleep(1)
# --------------------------------------------------------------
def addtask01():#将作业1添加到队列中
    pool.submit(job01,)  # 将job01任务【添加至线程池的队列中】
# --------------------------------------------------------------
def addtask02():#将作业2添加到队列中
    pool.submit(job02,)  # 将job02任务【添加至线程池的队列中】
# --------------------------------------------------------------
def addtask03():#将作业3添加到队列中
    pool.submit(job03,)  # 将job03任务【添加至线程池的队列中】
# --------------------------------------------------------------

if __name__=='__main__':
    startime=time.time()#设置一个时间起点,用于计算程序执行【耗时长】
    threadlist=[]#声明一个列表,用于接受子线程
    lock=threading.Lock()#申明一把锁,用于多线程同步(多个线程访问同一个对象,一次只能一个线程访问该对象)
    # 创建一个线程池
    # pool = tp.ThreadPool(5)
    pool = ThreadPoolExecutor(max_workers = 2)  #定义线程池
    # 创建子线程
    # thread=threading.Thread(target=test,args=('one',))
    # thread=threading.Thread(target=queue01)#子线程执行queue01任务函数
    # thread.start()#启动子线程
    # 等待子线程结束,主线程才往下执行
    # thread.join()
    # addtask()#主线程:执行任务函数,往线程池中添加任务
    print(time.time()-startime)#打印程序执行消耗的时长
    schedule.every(1).seconds.do(addtask01)
    schedule.every(1).seconds.do(addtask02)
    schedule.every(1).seconds.do(addtask03)
    # schedule.every().day.at("16:35:00").do(addtask01)
    # schedule.every().day.at("16:35:02").do(addtask01)
    # schedule.every().day.at("16:35:03").do(addtask01)
    #
    # schedule.every().day.at("16:35:04").do(addtask02)
    # schedule.every().day.at("16:35:05").do(addtask02)
    # schedule.every().day.at("16:35:06").do(addtask02)
    #
    # schedule.every().day.at("16:35:07").do(addtask03)
    # schedule.every().day.at("16:35:08").do(addtask03)
    # schedule.every().day.at("16:35:09").do(addtask03)
    while True:
        time_s=random.random()*0.5+1
        print('--------------------------线程池队列排队任务数量:',pool._work_queue.qsize())#pool._work_queue.qsize()获取线程队列的任务数
        schedule.run_pending()
        try:
            time.sleep(time_s)
        except:
            pass

标签:schedule,任务,every,time,print,线程,多线程
From: https://www.cnblogs.com/yiblue/p/17034622.html

相关文章

  • CodeForces - 1701C Schedule Management
    CodeForces-1701CScheduleManagement题解:二分答案很显然如果你给的时间越长,所有工作就越容易被完成,所以时间存在二分性,我们直接二分时间但是我们现在需要解决一......
  • java多线程知识点总结
    一、线程的三种创建方法1-1继承Thread继承thread方法然后重写run方法,在用start开启线程。代码实现:Threadt=newThread(){@Overridepu......
  • C++ - 多线程
    1.多线程传统的C++(C++11之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下......
  • 多线程的事务回滚问题
    多线程的事务回滚问题环境要求1.mybatis-plus或mybatis2.支持单表的增删改查3.书写工具类将集合平分,获取线程池importjava.util.ArrayList;importjava.util.List;......
  • QT线程间发送结构体
     QT的信号和槽机制能十分方便的用来传输数据,但是如果数据种类比较多,分类比较多的时候,就需要更好地更高效的来传递数据的方法。以结构体作为参数是个很不错的选择。这几天......
  • 定时调度插件------FluentScheduler
    定时调度插件------FluentScheduler源码地址官网文档地址使用说明dll引用文章使用的版本为5.5.1版本使用GuGet搜索FluentScheduler即可找到如果框架为.NETFramew......
  • Python调度库(schedule)——定时任务
    Python调度库(schedule库)——定时任务官网:https://schedule.readthedocs.io/en/stable/examples.html可用与线程池结合使用,进行多线程定时执行任务,也可以当做任务执行队列......
  • java中创建线程的三种方法
    1)继承Thread类创建线程2)实现Runnable接口创建线程3)使用Callable和Future创建线程通过继承Thread类来创建并启动多线程的一般步骤如下1】d定义Thread类的子类,并重写该类的run......
  • C#中线程和定时器的使用记录
    记录学习代码。使用线程,创建一个消息队列阻塞等待消息。使用定时器,每隔一秒钟发送一条消息。监听键盘Esc按键实现程序退出。代码如下:1usingSystem;2usingSy......
  • 线程协作4
    线程协作生产者消费者模式线程通信方法解决一管程法packagetest1;//测试生产者消费者模型--》利用缓冲区解决,管程法publicclassTestPC{publicstaticv......