Python自学:使用多进程处理 multiprocessing

这篇具有很好参考价值的文章主要介绍了Python自学:使用多进程处理 multiprocessing。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 使用多进程执行函数

以下代码没有使用多进程。

import time

start = time.perf_counter()

def do_something():
    print('Sleeping 1 second...')
    time.sleep(1)
    print('Done Sleep...')

do_something()
do_something()

finish = time.perf_counter()

print(f'Finished in {round(finish-start, 2)} second(s)')

输出为:
Sleeping 1 second…
Done Sleep…
Sleeping 1 second…
Done Sleep…
Finished in 2.03 second(s)

以下代码使用了多进程。
import time
import multiprocessing


def do_something():
    print('Sleeping 1 second...')
    time.sleep(1)
    print('Done Sleep...')


if __name__ == '__main__':

    start = time.perf_counter()

    p1 = multiprocessing.Process(target=do_something)
    p2 = multiprocessing.Process(target=do_something)

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    finish = time.perf_counter()

    print(f'Finished in {round(finish-start, 2)} second(s)')

输出为:
Sleeping 1 second…
Sleeping 1 second…
Done Sleep…
Done Sleep…
Finished in 1.07 second(s)

2. 使用loop创建多个进程,并在函数中传入参数。

import time
import multiprocessing


def do_something(seconds):
    print(f'Sleeping {seconds} second(s)...')
    time.sleep(seconds)
    print('Done Sleep...')


if __name__ == '__main__':

    start = time.perf_counter()

    processes = []

    for _ in range(10):
        p = multiprocessing.Process(target=do_something, args=[1.5])
        p.start()
        processes.append(p)

    for process in processes:
        process.join()

    finish = time.perf_counter()

    print(f'Finished in {round(finish-start, 2)} second(s)')

输出为:
Sleeping 1.5 second(s)…
Sleeping 1.5 second(s)…
Sleeping 1.5 second(s)…
Sleeping 1.5 second(s)…
Sleeping 1.5 second(s)…
Sleeping 1.5 second(s)…
Sleeping 1.5 second(s)…
Sleeping 1.5 second(s)…
Sleeping 1.5 second(s)…
Sleeping 1.5 second(s)…
Done Sleep…
Done Sleep…
Done Sleep…
Done Sleep…
Done Sleep…
Done Sleep…
Done Sleep…
Done Sleep…
Done Sleep…
Done Sleep…
Finished in 1.62 second(s)

3. 使用进程池实现多进程

import time
import concurrent.futures


def do_something(seconds):
    print(f'Sleeping {seconds} second(s)...')
    time.sleep(seconds)
    return f'Done Sleep...{seconds}'


if __name__ == '__main__':

    start = time.perf_counter()

    with concurrent.futures.ProcessPoolExecutor() as executor:
        secs = [5, 4, 3, 2, 1]
        results = executor.map(do_something, secs)

        for result in results:
            print(result)

    finish = time.perf_counter()

    print(f'Finished in {round(finish-start, 2)} second(s)')

输出为:
Sleeping 5 second(s)…
Sleeping 4 second(s)…
Sleeping 3 second(s)…
Sleeping 2 second(s)…
Sleeping 1 second(s)…
Done Sleep…5
Done Sleep…4
Done Sleep…3
Done Sleep…2
Done Sleep…1
Finished in 5.14 second(s)

4. 使用多进程处理图片

以下代码展示了没有使用多进程处理图片
import time
from PIL import Image, ImageFilter

img_names = [
    'photo-1516117172878-fd2c41f4a759.jpg',
    'photo-1532009324734-20a7a5813719.jpg',
    'photo-1524429656589-6633a470097c.jpg',
    'photo-1530224264768-7ff8c1789d79.jpg',
    'photo-1564135624576-c5c88640f235.jpg',
    'photo-1541698444083-023c97d3f4b6.jpg',
    'photo-1522364723953-452d3431c267.jpg',
    'photo-1493976040374-85c8e12f0c0e.jpg',
    'photo-1504198453319-5ce911bafcde.jpg',
    'photo-1530122037265-a5f1f91d3b99.jpg',
    'photo-1516972810927-80185027ca84.jpg',
    'photo-1550439062-609e1531270e.jpg',
    'photo-1549692520-acc6669e2f0c.jpg'
]

t1 = time.perf_counter()

size = (1200, 1200)

for img_name in img_names:
    img = Image.open(img_name)

    img = img.filter(ImageFilter.GaussianBlur(15))

    img.thumbnail(size)

    img.save(f'processed/{img_name}')
    print(f'{img_name} was processed...')

t2 = time.perf_counter()

print(f'Finished in {t2-t1} seconds')

输出为:
photo-1516117172878-fd2c41f4a759.jpg was processed…
photo-1532009324734-20a7a5813719.jpg was processed…
photo-1524429656589-6633a470097c.jpg was processed…
photo-1530224264768-7ff8c1789d79.jpg was processed…
photo-1564135624576-c5c88640f235.jpg was processed…
photo-1541698444083-023c97d3f4b6.jpg was processed…
photo-1522364723953-452d3431c267.jpg was processed…
photo-1493976040374-85c8e12f0c0e.jpg was processed…
photo-1504198453319-5ce911bafcde.jpg was processed…
photo-1530122037265-a5f1f91d3b99.jpg was processed…
photo-1516972810927-80185027ca84.jpg was processed…
photo-1550439062-609e1531270e.jpg was processed…
photo-1549692520-acc6669e2f0c.jpg was processed…
Finished in 13.196055100299418 seconds

使用多进程的方式处理图片

import time
import concurrent.futures
from PIL import Image, ImageFilter

img_names = [
    'photo-1516117172878-fd2c41f4a759.jpg',
    'photo-1532009324734-20a7a5813719.jpg',
    'photo-1524429656589-6633a470097c.jpg',
    'photo-1530224264768-7ff8c1789d79.jpg',
    'photo-1564135624576-c5c88640f235.jpg',
    'photo-1541698444083-023c97d3f4b6.jpg',
    'photo-1522364723953-452d3431c267.jpg',
    'photo-1493976040374-85c8e12f0c0e.jpg',
    'photo-1504198453319-5ce911bafcde.jpg',
    'photo-1530122037265-a5f1f91d3b99.jpg',
    'photo-1516972810927-80185027ca84.jpg',
    'photo-1550439062-609e1531270e.jpg',
    'photo-1549692520-acc6669e2f0c.jpg'
]


def process_image(img_name):
    
    img = Image.open(img_name)

    img = img.filter(ImageFilter.GaussianBlur(15))

    img.thumbnail((1200, 1200))

    img.save(f'processed/{img_name}')
    print(f'{img_name} was processed...')

if __name__ == '__main__':
    t1 = time.perf_counter()

    with concurrent.futures.ProcessPoolExecutor() as executor:
        executor.map(process_image, img_names)

    t2 = time.perf_counter()

    print(f'Finished in {t2-t1} seconds')

输出为:
photo-1516117172878-fd2c41f4a759.jpg was processed…
photo-1516972810927-80185027ca84.jpg was processed…
photo-1524429656589-6633a470097c.jpg was processed…
photo-1522364723953-452d3431c267.jpg was processed…
photo-1532009324734-20a7a5813719.jpg was processed…
photo-1530122037265-a5f1f91d3b99.jpg was processed…
photo-1530224264768-7ff8c1789d79.jpg was processed…
photo-1564135624576-c5c88640f235.jpg was processed…
photo-1550439062-609e1531270e.jpg was processed…
photo-1541698444083-023c97d3f4b6.jpg was processed…
photo-1549692520-acc6669e2f0c.jpg was processed…
photo-1504198453319-5ce911bafcde.jpg was processed…
photo-1493976040374-85c8e12f0c0e.jpg was processed…
Finished in 2.651644399855286 seconds文章来源地址https://www.toymoban.com/news/detail-703207.html

我们可以看到,处理时间缩短为原来的1/5,大大提高了图片处理的速度。

到了这里,关于Python自学:使用多进程处理 multiprocessing的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python分享之多进程探索 (multiprocessing包)

    在初步了解Python多进程之后,我们可以继续探索multiprocessing包中更加高级的工具。这些工具可以让我们更加便利地实现多进程。   进程池 进程池 (Process Pool)可以创建多个进程。这些进程就像是随时待命的士兵,准备执行任务(程序)。一个进程池中可以容纳多个待命的士兵。

    2024年02月08日
    浏览(34)
  • Python进程池multiprocessing.Pool八个函数对比

    Python的multiprocessing.Pool类提供了多种方法来分发任务给进程池中的工作进程。这些方法在功能和用途上有所不同,适用于不同的场景。以下是multiprocessing.Pool中八个主要函数的对比 apply() 功能:阻塞地执行一个函数,直到这个函数的执行完成。 用法:apply(func, args=(), kwds={}) 特

    2024年02月04日
    浏览(36)
  • Python 标准类库-并发执行之multiprocessing-基于进程的并行

    Python3.6 multiprocessing 是一个支持使用类似于线程模块的API派生进程的包。该包同时提供本地和远程并发,通过使用子进程而不是线程,有效地避开了全局解释器锁。因此, multiprocessing 模块允许程序员充分利用给定机器上的多个处理器。它同时在Unix和Windows上运行。 该模块还引

    2024年02月09日
    浏览(34)
  • 由浅入深走进Python异步编程【多进程】(含代码实例讲解 || multiprocessing、异步进程池、进程通信)

    从底层到第三方库,全面讲解python的异步编程。这节讲述的是python的多线程实现,纯干货,无概念,代码实例讲解。 本系列有6章左右,点击头像或者专栏查看更多内容,陆续更新,欢迎关注。 部分资料来源及参考链接: https://www.bilibili.com/video/BV1Li4y1j7RY/ 现在让我们初步进入

    2024年02月03日
    浏览(47)
  • 【神行百里】python开启多线程(threading)与多进程(multiprocessing)运行

      由于处理数据过多,程序运行很慢,就学习了一下python开启多线程与多进程的方法,虽然最后也没用上,但还是记录总结一下,以备不时之需。   传送门:进程与线程认识,进程与线程通俗理解   简言之, 进程为资源分配的最小单元,线程为程序执行的最小单元

    2024年02月02日
    浏览(43)
  • Python__模块(TIME-进程/线程)__concurrent / multiprocessing

    进程或线程的使用。 线程是共享内存空间。 进程是内存独立状态。 同一个进程的线程之间可以直接交流。 两个进程想通信,必须通过一个中间代理来实现。 使用多线程能充分利用 CPU 来提供程序的执行效率。 每一个进程启动时都会最先产生一个线程,即主线程,然后主线程

    2024年02月04日
    浏览(34)
  • python multiprocessing库使用记录

    需求是想并行调用形式化分析工具proverif,同时发起对多个query的分析(378个)。实验室有40核心80线程的服务器(双cpu,至强gold 5218R*2)。 观察到单个命令在分析时内存占用不大,且只使用单核心执行,因此考虑同时调用多个命令同时执行分析,加快结果输出。 最底层的逻辑

    2024年02月12日
    浏览(35)
  • Queue的多线程爬虫和multiprocessing多进程

    Queue的模块里面提供了同步的、线程安全的队列类,包括FIFO(先入后出)队列Queue、FIFO(后入先出)LifoQueue和优先队列PriorityQueue。 (在上个文件创建了爬取文件) 我们使用这个方法来获取,代码如下: 对象传入myThread中; thread = myThread(tName,workQueue)  使用一个for循环来

    2024年04月14日
    浏览(40)
  • multiprocessing.shared_memory --- 从进程直接访问的共享内存(1)

    模块提供了一个类 SharedMemory ,用于分配和管理共享内存,供多核或对称多处理器 (SMP) 机器上的一个或多个进程访问。 为了协助共享内存的生命周期管理,尤其是跨不同进程的共享内存, multiprocessing.managers 模块中还提供了一个 BaseManager 子类 SharedMemoryManager 。 在这个模块中

    2024年04月22日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包