python3 线程安全_python应用:Python3标准库,queue线程安全的FIFO实现

1. queue线程安全的FIFO实现

Python是一种解释型脚本语言,可以应用于以下领域:

web和Internet开发

科学计算和统计

人工智能

教育

桌面界面开发

软件开发

后端开发

网络爬虫

queue模块提供了一个适用于多线程编程的先进先出(FIFO,first-in,first-out)数据结构,可以用来在生产者和消费者线程之间安全地传递消息或其他数据。它会为调用者处理锁定,使多个线程可以安全而容易地处理同一个Queue实例。Queue的大小(其中包含的元素个数)可能受限,以限制内存使用或处理。

1.1 基本FIFO队列

Queue类实现了一个基本的先进先出容器。使用put()将元素增加到这个序列的一端,使用get()从另一端删除。

importqueue

q=queue.Queue()

foriinrange(5):

q.put(i)

whilenotq.empty():

print(q.get(),end='')

print()

这个例子使用了一个线程来展示按插入元素的相同顺序从队列删除元素。

1.2 LIFO队列

与Queue的标准FIFO实现相反,LifoQueue使用了(通常与栈数据结构关联的)后进后出(LIFO,last-in,first-out)顺序。

importqueue

q=queue.LifoQueue()

foriinrange(5):

q.put(i)

whilenotq.empty():

print(q.get(),end='')

print()

get将删除最近使用put插入到队列的元素。

1.3 优先队列

有些情况下,需要根据队列中元素的特性来决定这些元素的处理顺序,而不是简单地采用在队列中创建或插入元素的顺序。例如,工资部门的打印作业可能就优先于某个开发人员想要打印的代码清单。PriorityQueue使用队列内容的有序顺序来决定获取哪一个元素。

importfunctools

importqueue

importthreading

@functools.total_ordering

classJob:

def__init__(self,priority,description):

self.priority=priority

self.description=description

print('New job:',description)

return

def__eq__(self,other):

try:

returnself.priority==other.priority

exceptAttributeError:

returnNotImplemented

def__lt__(self,other):

try:

returnself.priority

exceptAttributeError:

returnNotImplemented

q=queue.PriorityQueue()

q.put(Job(3,'Mid-level job'))

q.put(Job(10,'Low-level job'))

q.put(Job(1,'Important job'))

defprocess_job(q):

whileTrue:

next_job=q.get()

print('Processing job:',next_job.description)

q.task_done()

workers=[

threading.Thread(target=process_job,args=(q,)),

threading.Thread(target=process_job,args=(q,)),

]

forwinworkers:

w.setDaemon(True)

w.start()

q.join()

这个例子有多个线程在处理作业,要根据调用get()时队列中元素的优先级来处理。运行消费者线程时,增加到队列的元素的处理顺序取决于线程上下文切换。

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值