python之用队列及多进程实现并发

本文介绍了如何使用Python的队列和多进程实现并发图像处理,核心是通过队列分发任务和收集结果。程序创建了两个队列,一个用于存放待执行任务,另一个用于收集结果。通过`ProcessPoolExecutor`进行任务调度,利用`Future`对象跟踪任务状态。此外,文章还探讨了使用`concurrent.futures`模块实现并发的优缺点,以及与使用队列的区别。
摘要由CSDN通过智能技术生成

写在开头,整理了一些资料,有需要的小伙伴可以点这里,暗号:CSDN
在这里插入图片描述

用队列及多进程实现并发

imagescale-q-m.py程序创建了两个队列,一个用来保存待执行的任务(也就是待 缩小的图像),另一个用来收集任务的执行结果。

Result = collections.namedtuple("Result", Mcopied scaled name")
Summary = collections.namedtuple("Summary", "todo copied scaled canceled")

Result是个“具名元组”(named tuple),用来存放单张图片的处理结果。其中前两个 元素表示拷贝及缩小过的图片数量,对于单张图片来说,这两个值要么是1、0,要么是0、 1,第三个元素是缩小后的图片名称。Summary也是个具名元组,用来汇总所有图片的处 理结果。

def main():
size, smooth, source, target, concurrency = handle_commandline()
Qtrac.report)"starting...
summary = scale(size, smooth, source, target, concurrency) summarize(summary, concurrency)

所有图像缩小程序的main ()函数都一样,它先用自编的handle_commandline () 函数(此函数前面讲过)读出命令行参数。函数所返回的五个参数分别表示:缩小后的图像 尺寸、是否釆用平滑缩放、缩小前的图片所在的目录、缩小后的图片所在的目录以及程序所 使用的线程或进程个数(只有并发版本才会用到这个参数,其默认值等于CPU的核心数)。
在这里插入图片描述

程序随后告诉用户,现在开始执行图片缩小操作,然后调用scale ()函数,全部任 务都会在这个函数里完成。scale ()函数会把执行结果汇总,并返回给调用者,我们用 summarize ()函数将其打印出来。

def report(message="", error=False):
if len(message) >= 70 and not error:
message = message!:67] + "..."
sys.stdout.write("\r(:70}{}".format(message, "\n" if error else "")) sys.stdout.flush()

本次与并发相关的所有范例程序都要使用控制台,为了用起来方便一些,我们把 report ()函数放在了 Qtrac.py模块里。该函数用message参数中的消息来覆写控制 台当前这一行的文字(如果大于70个字符,那么就截取前67个),并调用flush ()方法将其 立刻打印到控制台里。如果message中的消息是错误信息,那么就在后面加上换行符,以 防其他消息覆写此信息。reportO函数不会将错误信息截短。

def scale(size, smooth, source, target, concurrency):
canceled = False
jobs = multiprocessing.JoinableQueue() results = multiprocessing.Queued create_processes(size, smooth, jobs, results, concurrency) todo = add_jobs(source, target, jobs)
try:
jobs.join()
except Keyboardinterrupt: # May not work on Windows
Qtrac.report("canceling...
canceled = True
copied = scaled = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值