• python-day40(正式学习)


    线程队列

    1

    import queue
    
    q=queue.Queue()
    q.put('123')
    q.put('456')
    q.put('789')
    print(q.get())
    print(q.get())
    print(q.get())
    q.task_done()
    # q.task_done()
    q.task_done()
    q.join()        #等到队列里的元素都被消费才进行下一步
    q.put(1)
    print(q.get())
    

    2

    import queue
    
    q=queue.LifoQueue()		#栈,先进后出
    q.put('123')
    q.put('456')
    q.put('789')
    print(q.get())
    print(q.get())
    print(q.get())
    q.task_done()
    q.task_done()
    q.task_done()
    q.join()        #等到队列里的元素都被消费才进行下一步
    q.put(1)
    print(q.get())
    

    3

    import queue
    
    q=queue.PriorityQueue()		#以元祖的形式输入,第一个整形为优先级,小的先输出
    q.put((1,'123'))
    q.put((4,'456'))
    q.put((2,'789'))
    print(q.get())
    print(q.get())
    print(q.get())
    q.task_done()
    q.task_done()
    q.task_done()
    q.join()        #等到队列里的元素都被消费才进行下一步
    q.put((1,'ad'))
    print(q.get())
    

    线程定时器

    from threading import Thread,Timer
    import time
    
    def test():
        print('start')
        time.sleep(1)
        print('end')
    
    t=Timer(3,function=test) #3秒后开启线程
    t.start()
    

    进程池和线程池

    from concurrent.futures import ThreadPoolExecutor
    import time
    
    def test():
        print(time.time())
        time.sleep(1)
        # return i**3
    pool=ThreadPoolExecutor(5)		#线程池,进程池用ProcessPoolExecutor
    list=[]
    for i in range(20):
        furture=pool.submit(test)
        list.append(furture)
    for i in list:
        print(i.result())
    
    from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
    from threading import currentThread
    from multiprocessing import current_process
    import time
    
    def task(i):
        print(f'{currentThread().name} 在执行任务 {i}')
        # print(f'进程 {current_process().name} 在执行任务 {i}')
        time.sleep(1)
        return i**2
    
    
    def parse(future):
        # 处理拿到的结果
        print(future.result())
    
    
    
    if __name__ == '__main__':
        pool = ThreadPoolExecutor(4) # 池子里只有4个线程
        # pool = ProcessPoolExecutor(4) # 池子里只有4个线程
        fu_list = []
        for i in range(20):
            # pool.submit(task,i) # task任务要做20次,4个线程负责做这个事
            future = pool.submit(task,i) # task任务要做20次,4个进程负责做这个事
            future.add_done_callback(parse)
            # 为当前任务绑定了一个函数,在当前任务执行结束的时候会触发这个函数,
            # 会把future对象作为参数传给函数
            # 这个称之为回调函数,处理完了回来就调用这个函数.
    
    
            # print(future.result()) # 如果没有结果一直等待拿到结果,导致了所有的任务都在串行
    
        # pool.shutdown() # 关闭了池的入口,会等待所有的任务执行完,结束阻塞.
        # for fu in fu_list:
        #     print(fu.result())
    
  • 相关阅读:
    FFT入门
    FJOI省队集训 chessboard
    FJOI省队集训 florida
    树上莫队
    NOIP2015 Revenge
    APIO2013 tasksauthor
    油漆门
    一些字符串有关的题目
    字符串题模板集合
    sg函数与博弈论2
  • 原文地址:https://www.cnblogs.com/leaf-wind/p/11552522.html
Copyright © 2020-2023  润新知