Python多进程并发与同步机制超详细讲解

Python多进程并发与同步机制超详细讲解

1. 什么是多进程并发

多进程并发指的是在同一时间内,有多个进程可以同时执行。在操作系统中,一个进程是一个独立的执行单元,有自己的内存空间和系统资源。多进程并发可以提高程序的执行效率和并发度。Python中的multiprocessing模块提供了多进程并发的功能。

2. multiprocessing模块的介绍

  • multiprocessing模块可以在Python中轻松创建和管理多个进程
  • multiprocessing中的Process类是Process实例的基础,可以用来创建和管理子进程
  • multiprocessing还提供了相互间进行通信和同步的工具,如Queue、Pipe、Value、Lock等

3. multiprocessing模块的使用

3.1 创建子进程

  1. 使用Process类的构造函数来创建进程实例,并指定需要执行的函数
import multiprocessing

def worker():
    print("子进程执行")

if __name__ == '__main__':
    p = multiprocessing.Process(target=worker)
    p.start()
  1. 继承Process类,并覆盖run()方法,来自定义进程
import multiprocessing

class Worker(multiprocessing.Process):
    def run(self):
        print("子进程执行")

if __name__ == '__main__':
    p = Worker()
    p.start()

3.2 进程间通信

  1. 使用Queue实现多个进程之间的信息共享
import multiprocessing

def producer(queue):
    queue.put('a')

def consumer(queue):
    print(queue.get())

if __name__ == '__main__':
    queue = multiprocessing.Queue()
    p1 = multiprocessing.Process(target=producer, args=(queue,))
    p2 = multiprocessing.Process(target=consumer, args=(queue,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
  1. 使用Pipe实现两个进程之间的信息传递
import multiprocessing

def sender(conn):
    conn.send('a')

def receiver(conn):
    print(conn.recv())

if __name__ == '__main__':
    parent_conn, child_conn = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=sender, args=(child_conn,))
    p2 = multiprocessing.Process(target=receiver, args=(parent_conn,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

3.3 进程间同步

使用Lock实现多个进程之间的同步

import multiprocessing

def worker(lock):
    lock.acquire()
    print('子进程执行')
    lock.release()

if __name__ == '__main__':
    lock = multiprocessing.Lock()
    p = multiprocessing.Process(target=worker, args=(lock,))
    p.start()
    p.join()

4. 多进程并发示例

4.1 使用multiprocessing模块下载图片

import requests
import multiprocessing

def download(url):
    filename = url.split('/')[-1]
    response = requests.get(url)
    with open(filename, 'wb') as f:
        f.write(response.content)

if __name__ == '__main__':
    urls = [
        'https://picsum.photos/500/500',
        'https://picsum.photos/600/600',
        'https://picsum.photos/700/700',
        'https://picsum.photos/800/800',
    ]
    processes = []
    for url in urls:
        p = multiprocessing.Process(target=download, args=(url,))
        p.start()
        processes.append(p)
    for p in processes:
        p.join()

4.2 使用multiprocessing模块并发爬虫

import requests
import multiprocessing
from bs4 import BeautifulSoup

def get_links(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    links = [link.get('href', '') for link in soup.find_all('a')]
    return links

def crawl_links(links):
    for link in links:
        response = requests.get(link)
        soup = BeautifulSoup(response.text, 'html.parser')
        title = soup.find('title').text
        print(title)

if __name__ == '__main__':
    urls = [
        'https://www.baidu.com',
        'https://www.bilibili.com',
        'https://www.jd.com',
        'https://www.douban.com',
    ]
    pool = multiprocessing.Pool(processes=4)
    for url in urls:
        links = pool.apply(get_links, args=(url,))
        pool.apply_async(crawl_links, args=(links,))
    pool.close()
    pool.join()

以上就是Python多进程并发与同步机制的超详细讲解,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python多进程并发与同步机制超详细讲解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Java中遍历集合的并发修改异常解决方案实例代码

    关于“Java中遍历集合的并发修改异常解决方案实例代码”的攻略,我提供以下内容: 1. 问题描述 在 Java 中遍历集合时,如果在遍历过程中修改了集合,就会出现并发修改异常(ConcurrentModificationException),该异常通常在迭代集合时被抛出。 2. 解决方案 Java 提供了多种方式解决并发修改异常,下面我们来逐一介绍。 2.1…

    多线程 2023年5月17日
    00
  • Java进阶必备之多线程编程

    Java进阶必备之多线程编程攻略 在Java编程中,多线程编程是一项重要的技能。多线程编程可以提高程序的并发性和效率,使程序具有更好的响应性和用户体验。 1. 必备知识点 在进行多线程编程之前,您需要掌握以下重要的知识点: 1.1 线程的生命周期 Java中的线程具有生命周期。线程的生命周期包括以下几个状态: 新建状态(New):当创建了一个线程对象后,该线…

    多线程 2023年5月17日
    00
  • Java并发编程之阻塞队列(BlockingQueue)详解

    Java并发编程之阻塞队列(BlockingQueue)详解 什么是阻塞队列? 阻塞队列,顾名思义就是在队列的基础上加入了阻塞的特性。当队列满时,阻塞队列会自动阻塞写入线程,直到队列中有元素被移除,而当队列为空时,阻塞队列会自动阻塞读取线程,直到队列中有元素被添加。 Java中的阻塞队列是一个线程安全的队列,实现了如同锁的机制,可以保证多个线程同时访问是安全…

    多线程 2023年5月16日
    00
  • Python并发编程线程消息通信机制详解

    Python并发编程线程消息通信机制详解 在Python并发编程中,线程之间通信是非常常见的场景,本文将详细讲解Python线程之间的消息通信机制,包括线程锁、事件、条件、队列等几种常见的机制。 线程锁 Python中的线程锁又称为互斥锁,用于限制多个线程访问同一共享资源时的冲突。下面是一个基本的示例: import threading x = 0 lock…

    多线程 2023年5月17日
    00
  • C#集合之并发集合的用法

    C#集合之并发集合的用法 什么是并发集合 并发集合是一组C#中线程安全的集合类型,允许多个线程同时对一个集合进行读写操作,而不需要进行额外的同步处理。在多线程的场景下,使用并发集合可以提高代码的并发性能,避免多线程访问同一个集合时可能出现的线程安全问题。 .NET Framework提供了多种并发集合类型,包括ConcurrentDictionary、Con…

    多线程 2023年5月16日
    00
  • Redis处理高并发机制原理及实例解析

    Redis处理高并发机制原理及实例解析 简介 Redis是一种高性能的NoSQL存储,拥有高并发、高可用、高性能等特点。在现代web应用中,Redis已经成为了必不可少的组件之一。本文将详细介绍Redis处理高并发的机制原理,并结合实例进行说明。 Redis处理高并发的机制原理 Redis处理高并发的机制主要依靠以下两个方面: 基于单线程模型的高效执行 多种…

    多线程 2023年5月16日
    00
  • java多线程join()方法的作用和实现原理解析(应用场景)

    java多线程join()方法的作用和实现原理解析 作用 在Java多线程编程中,有时候需要等待一个线程完成后再去执行其他任务。这时候就需要用到join()方法。join()方法会阻塞当前线程,等待被调用线程执行完成后再继续执行。 实现原理 当调用join()方法时,调用线程会进入等待状态,等待被调用线程执行完成。在Thread的join()方法内部,会调用…

    多线程 2023年5月17日
    00
  • Java多线程回调方法实例解析

    Java多线程回调方法实例解析 什么是回调方法 在Java中,回调方法是指将一个方法作为参数传递给另一个方法,并在另一个方法执行后,调用传入的方法。这种方式可以让我们将一个方法的执行结果传递给另一个方法,从而实现代码的复用和解耦。 为什么要使用多线程回调方法 在多线程编程中,需要处理并发执行的任务。一个任务执行完成后,需要通知其他任务执行相关的代码,这时就需…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部