1. <legend id='gSD4A'><style id='gSD4A'><dir id='gSD4A'><q id='gSD4A'></q></dir></style></legend>
      <bdo id='gSD4A'></bdo><ul id='gSD4A'></ul>
    <tfoot id='gSD4A'></tfoot>
  2. <i id='gSD4A'><tr id='gSD4A'><dt id='gSD4A'><q id='gSD4A'><span id='gSD4A'><b id='gSD4A'><form id='gSD4A'><ins id='gSD4A'></ins><ul id='gSD4A'></ul><sub id='gSD4A'></sub></form><legend id='gSD4A'></legend><bdo id='gSD4A'><pre id='gSD4A'><center id='gSD4A'></center></pre></bdo></b><th id='gSD4A'></th></span></q></dt></tr></i><div id='gSD4A'><tfoot id='gSD4A'></tfoot><dl id='gSD4A'><fieldset id='gSD4A'></fieldset></dl></div>

      <small id='gSD4A'></small><noframes id='gSD4A'>

      详解python之多进程和进程池(Processing库)

      时间:2023-12-16

        <bdo id='oGw1S'></bdo><ul id='oGw1S'></ul>
          <legend id='oGw1S'><style id='oGw1S'><dir id='oGw1S'><q id='oGw1S'></q></dir></style></legend>

            <small id='oGw1S'></small><noframes id='oGw1S'>

            1. <tfoot id='oGw1S'></tfoot>
                <tbody id='oGw1S'></tbody>
                <i id='oGw1S'><tr id='oGw1S'><dt id='oGw1S'><q id='oGw1S'><span id='oGw1S'><b id='oGw1S'><form id='oGw1S'><ins id='oGw1S'></ins><ul id='oGw1S'></ul><sub id='oGw1S'></sub></form><legend id='oGw1S'></legend><bdo id='oGw1S'><pre id='oGw1S'><center id='oGw1S'></center></pre></bdo></b><th id='oGw1S'></th></span></q></dt></tr></i><div id='oGw1S'><tfoot id='oGw1S'></tfoot><dl id='oGw1S'><fieldset id='oGw1S'></fieldset></dl></div>

                详解Python之多进程和进程池

                一、多进程概念

                进程是系统资源分配的最小单位,一个进程可以有多个线程,这些线程共享进程的内存空间和系统资源。在Python中,可以通过multiprocessing模块实现多进程的功能。

                二、多进程的好处

                1. 充分利用多核CPU,提升程序运行效率;
                2. 进程之间独立,一个进程挂掉不会影响其他进程的运行;
                3. 可以利用操作系统的进程管理机制,避免出现死锁现象。

                三、多进程的实现方式

                3.1 普通多进程

                使用multiprocessing模块的Process类可以实现简单的多进程,示例代码如下:

                from multiprocessing import Process
                
                def func():
                    print('子进程执行')
                
                if __name__ == '__main__':
                    p = Process(target=func)
                    p.start()
                    p.join()
                    print('主进程执行')
                

                代码解析:

                1. 通过multiprocessing模块的Process类创建子进程,并指定执行函数为func()
                2. 子进程通过调用指定的函数进行任务处理;
                3. 主进程通过p.join()方法等待子进程执行完毕,再执行后续代码。

                3.2 进程池

                使用进程池可以避免频繁创建和销毁进程,从而提高程序的执行效率。使用multiprocessing模块的Pool类可以实现进程池,示例代码如下:

                from multiprocessing import Pool
                import os
                import time
                
                def func(n):
                    print(f'子进程{os.getpid()}执行{n}')
                    time.sleep(1)
                    return n
                
                if __name__ == '__main__':
                    p = Pool(3)
                    results = p.map(func, range(10))
                    print(results)
                

                代码解析:

                1. 通过multiprocessing模块的Pool类创建进程池,并指定最大进程数为3,即同时运行3个子进程;
                2. 子进程通过调用指定的函数进行任务处理,这里模拟了任务处理需要一定时间的情况;
                3. 主进程通过p.map()方法向进程池中添加任务,并等待任务执行完毕;
                4. p.map()方法返回一个结果集,结果集的元素按照任务添加的顺序排列。

                四、总结

                多进程和进程池是Python中实现并行计算的重要方式,能够充分利用多核CPU提高程序运行效率。multiprocessing模块是Python标准库中提供的多进程处理模块,使用简单,功能强大,值得掌握和使用。

                五、示例

                5.1 利用进程池进行网络爬虫

                利用Python的并行计算,可以有效提升网络爬虫的效率。下面是一个简单的示例:

                import requests
                from bs4 import BeautifulSoup
                from multiprocessing import Pool
                
                def get_url(url):
                    response = requests.get(url)
                    soup = BeautifulSoup(response.content)
                    title = soup.select_one('title').text
                    return title
                
                if __name__ == '__main__':
                    urls = ['https://www.baidu.com', 'https://www.google.com', 'https://www.bing.com']
                    p = Pool(len(urls))
                    results = p.map(get_url, urls)
                    print(results)
                

                代码解析:

                1. get_url()函数中通过requestsBeautifulSoup模块获取网页标题;
                2. 在主程序中创建进程池,并向进程池中添加子进程任务;
                3. p.map()方法返回所有子进程处理的结果。

                5.2 利用多进程进行图片下载

                多进程能够大大提高图片的下载效率,下面是一个简单的示例:

                import requests
                from multiprocessing import Process
                
                def download(image_url, path):
                    response = requests.get(image_url)
                    with open(path, 'wb') as f:
                        f.write(response.content)
                
                if __name__ == '__main__':
                    urls = [
                        ('https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png', 'google.png'),
                        ('https://www.baidu.com/img/bd_logo1.png', 'baidu.png')
                    ]
                    processes = [Process(target=download, args=(url[0], url[1])) for url in urls]
                    for process in processes:
                        process.start()
                    for process in processes:
                        process.join()
                

                代码解析:

                1. download()函数中通过requests模块下载图片,并保存到指定路径;
                2. 在主程序中创建多个子进程,并将每个子进程的任务指定为下载指定的图片;
                3. 通过循环遍历所有子进程,并对其进行启动和等待。
                上一篇:python互斥锁、加锁、同步机制、异步通信知识总结 下一篇:python sleep和wait对比总结

                相关文章

                <legend id='U8vHd'><style id='U8vHd'><dir id='U8vHd'><q id='U8vHd'></q></dir></style></legend>

                <i id='U8vHd'><tr id='U8vHd'><dt id='U8vHd'><q id='U8vHd'><span id='U8vHd'><b id='U8vHd'><form id='U8vHd'><ins id='U8vHd'></ins><ul id='U8vHd'></ul><sub id='U8vHd'></sub></form><legend id='U8vHd'></legend><bdo id='U8vHd'><pre id='U8vHd'><center id='U8vHd'></center></pre></bdo></b><th id='U8vHd'></th></span></q></dt></tr></i><div id='U8vHd'><tfoot id='U8vHd'></tfoot><dl id='U8vHd'><fieldset id='U8vHd'></fieldset></dl></div>
                <tfoot id='U8vHd'></tfoot>
                  <bdo id='U8vHd'></bdo><ul id='U8vHd'></ul>
              1. <small id='U8vHd'></small><noframes id='U8vHd'>