defworker(self):whileTrue:tupl=self.get()item, args, kwargs=self.get()item(*args,**kwargs)self.task_done()
【python创建队列函数 python3 队列】worker 函数获取队列顶端的任务,并根据输入参数运行 , 除此之外,没有其他的功能 。下面是队列的代码:
我们可以通过下面的代码测试:
defblokkah(*args,**kwargs):time.sleep(5)print“Blokkah mofo!” q=TaskQueue(num_workers=5) foriteminrange(1):q.add_task(blokkah) q.join()# wait for all the tasks to finish. print“Alldone!”
Blokkah 是我们要做的任务名称 。队列已经缓存在内存中,并且没有执行很多任务 。下面的步骤是把主队列当做单独的进程来运行,这样主程序退出以及执行数据库持久化时,队列任务不会停止运行 。但是这个例子很好地展示了如何从一个很简单的小任务写成像工作队列这样复杂的程序 。
defgradient_descent():# the gradient descent codequeue.add_task(plotly.write, x=X, y=Y)
修改之后 , 我的梯度下降算法工作效率似乎更高了 。如果你很感兴趣的话 , 可以参考下面的代码 。fromthreadingimportThreadimportQueueimporttime classTaskQueue(Queue.Queue): def__init__(self, num_workers=1):Queue.Queue.__init__(self)self.num_workers=num_workersself.start_workers() defadd_task(self, task,*args,**kwargs):args=argsor()kwargs=kwargsor{}self.put((task, args, kwargs)) defstart_workers(self):foriinrange(self.num_workers):t=Thread(target=self.worker)t.daemon=Truet.start() defworker(self):whileTrue:tupl=self.get()item, args, kwargs=self.get()item(*args,**kwargs)self.task_done() deftests():defblokkah(*args,**kwargs):time.sleep(5)print"Blokkah mofo!" q=TaskQueue(num_workers=5) foriteminrange(10):q.add_task(blokkah) q.join()# block until all tasks are doneprint"All done!" if__name__=="__main__":tests()
Python Queue 入门Queue 叫队列,是数据结构中的一种,基本上所有成熟的编程语言都内置了对 Queue 的支持 。
Python 中的 Queue 模块实现了多生产者和多消费者模型,当需要在多线程编程中非常实用 。而且该模块中的 Queue 类实现了锁原语,不需要再考虑多线程安全问题 。
该模块内置了三种类型的 Queue,分别是class queue.Queue(maxsize=0),class queue.LifoQueue(maxsize=0)和class queue.PriorityQueue(maxsize=0)。它们三个的区别仅仅是取出时的顺序不一致而已 。
Queue 是一个 FIFO 队列,任务按照添加的顺序被取出 。
LifoQueue 是一个 LIFO 队列,类似堆栈,后添加的任务先被取出 。
PriorityQueue 是一个优先级队列 , 队列里面的任务按照优先级排序 , 优先级高的先被取出 。
如你所见,就是上面所说的三种不同类型的内置队列,其中 maxsize 是个整数,用于设置可以放入队列中的任务数的上限 。当达到这个大小的时候,插入操作将阻塞至队列中的任务被消费掉 。如果 maxsize 小于等于零,则队列尺寸为无限大 。
向队列中添加任务 , 直接调用put()函数即可
put()函数完整的函数签名如下Queue.put(item, block=True, timeout=None),如你所见,该函数有两个可选参数 。
默认情况下,在队列满时,该函数会一直阻塞,直到队列中有空余的位置可以添加任务为止 。如果 timeout 是正数,则最多阻塞 timeout 秒,如果这段时间内还没有空余的位置出来,则会引发Full异常 。
当 block 为 false 时,timeout 参数将失效 。同时如果队列中没有空余的位置可添加任务则会引发Full异常 , 否则会直接把任务放入队列并返回,不会阻塞 。
另外,还可以通过Queue.put_nowait(item)来添加任务,相当于Queue.put(item, False),不再赘述 。同样,在队列满时 , 该操作会引发Full异常 。
从队列中获取任务,直接调用get()函数即可 。
推荐阅读
- 手游赛车竞速类游戏,赛车竞速类的游戏
- 新媒体如何提高能力,新媒体如何提高能力的方法
- 房产中介如何进行营销创新,适合房产中介的营销方案
- 九阳电磁炉直播卖货视频,九阳电磁炉京东商城自营
- php获取数据库配置文件 php的数据库配置在哪
- 系统u盘怎么变系统盘,如何把系统u盘变成普通u盘
- 桌面游戏广告卸载,桌面游戏广告卸载不了
- 7750cpu配什么,7750配什么主板
- 两个函数如何相加c语言 两个函数加在一起