当前位置: 首页 > 后端技术 > Python

Python队列和线程池

时间:2023-03-25 19:41:01 Python

锁可以解决变量共享的问题,但是并不通用。为什么要锁别人?让我们好好排队。这样就不会出现死锁。事实上,队列有自己的锁。Queue队列是python的标准库,俗称queue。可以直接导入引用。在python2.x中,模块名称是Queue。python3是小写队列。在python中,多个线程之间的数据是共享的。多个线程交换数据时,无法保证数据的安全性和一致性。因此,当多个线程需要交换数据时,队列就出现了。现在,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性(简单来说,多线程需要加锁,容易造成死锁,而队列自带锁。所以多线程结合队列会好很多导入:fromqueueimportQueue先来看一个案例,queue是一个put和get两个操作,一个走,一个进。randint#3queuemy_queue=Queue(3)deff1(my_queus):foriinrange(3):time.sleep(1)num=randint(0,10)打印(num)my_queue.put(num)deff2(my_queus):foriinrange(3):time.sleep(1)num=my_queue.get()print(num)t1=Thread(target=f1,args=(my_queue,))t2=Thread(target=f2,args=(my_queue,))t1.start()t2.start()t1.join()t2.join()执行吧,randint就是从0-10随机取一个数10103355这是和中的一个一个出来。Queue还有下面几种用法,线程池线程太多了不说,是不是把它们放在一个池子里比较好,于是线程池就出来了。既然我有任务,我就找一个线程来完成这项工作。使用了multiprocessing标准库,ThreadPool类比之前的Thread类拥有更多的Pools。下面看demo,使用这个ThreadPool。ThreadPool(3)表示线程池有3个线程,apply_async是分配任务,传入一个函数frommultiprocessing.poolimportThreadPoolimporttimedefhello(name):print('hello,{}'.format(name))time.sleep(2)print('Bye')t=ThreadPool(3)foriinrange(3):t.apply_async(hello,args=(i,))t.close()t.join()Let'srunOUT:almostcompletehellotogether,0hello,1hello,2almostcompletetogetherByeByeBye三个线程一起工作,每个线程完成我们的hello任务,最后一起完成。我们上面使用的foriinrange方法执行任务,因为任务是一样的,传入的参数也是一样的。再看最后一个,传入args,*kwargs参数frommultiprocessing.poolimportThreadPoolimporttimepool=ThreadPool(2)deftask1():time.sleep(1)print("Task1completed")deftask2(*args,**kwargs):time.sleep(1)print("任务2完成:",args,kwargs)pool.apply_async(task1)pool.apply_async(task2,args=(1,2),kwds={'a':1,'b':2})print("任务提交完成")pool.close()pool.join()print("任务完成")执行如下:任务提交完成任务1completedTask2completed:(1,2){'a':1,'b':2}任务完成。对于进程和线程来说,这就是结束。使用进程和线程在爬虫中,可以提高爬虫速度,没了。文渊网络仅供学习使用,如有侵权,请联系删除。我的公众号【Python圈】汇集了优质的技术文章和经验总结。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,600+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕学不会!还有学习交流群,一起学习进步~