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并发之嵌套管程锁死详解 简介 Java 并发编程中的管程(Monitor)是实现并发编程的常见方式,该技术利用了锁、条件变量等概念来协调多个线程间的执行。然而,嵌套的管程锁死却是烦扰Java并发编程的一大难题。本文将详细讲解嵌套管程锁死的原因、如何解决及相关实例说明。 嵌套管程锁死原因 管程中的锁是互斥锁,当一个线程获取了管程上的锁,其他线程就无法访…

    多线程 2023年5月16日
    00
  • python如何支持并发方法详解

    下面是关于Python如何支持并发方法的详解攻略。 1. 什么是并发? 并发是指一个系统可以同时处理多个任务的能力。Python中通过多线程和多进程两种方式实现并发编程。 2. Python的并发方法 2.1 多线程 Python中的多线程通过threading库实现。多线程可以在同一进程内分配不同任务给不同线程执行,从而提高程序的效率。 下面是一个基本的多…

    多线程 2023年5月16日
    00
  • Go语言使用goroutine及通道实现并发详解

    Go语言使用goroutine及通道实现并发详解 前言 在进行并发编程时,一个优雅而简单的方式是使用goroutine和通道(channel)进行操作。本文将详细讲解使用Go语言实现并发的方法,通过学习本文内容,读者将掌握以下知识点: goroutine使用方法 通道(channel)与缓冲区使用方法 select语句的使用 goroutine使用方法 go…

    多线程 2023年5月17日
    00
  • java 线程池的实现原理、优点与风险、以及4种线程池实现

    当我们处理大量任务的时候,线程池是一种常用的解决方案,使用线程池可以控制线程数量,提高效率,避免线程频繁创建和销毁的开销。本文就来详细讲解Java线程池的实现原理、优点与风险以及四种线程池实现。 Java线程池的实现原理 Java线程池的实现原理是基于线程池的管理器、工作线程、任务队列三部分来完成。线程池的管理器负责管理线程池的状态、任务分发、工作线程的创建…

    多线程 2023年5月16日
    00
  • Java线程创建(卖票),线程同步(卖包子)的实现示例

    Java线程创建和线程同步是多线程编程必须掌握的核心知识点。下面将介绍Java线程创建和线程同步的实现示例。 Java线程创建的实现示例 Java线程创建通常有两种方式:继承Thread类和实现Runnable接口。 继承Thread类的实现示例 代码示例: public class TicketSeller extends Thread { private…

    多线程 2023年5月17日
    00
  • java多线程应用实现方法

    Java多线程应用实现方法 什么是多线程 多线程是指程序中同时存在多个线程执行不同的任务。在Java中,每个线程都是一个单独的执行流程,每个线程都拥有自己的栈空间和执行上下文。 为什么需要使用多线程 在某些场景下,使用多线程能够提高程序的运行效率和响应速度。举例来说,当一个程序需要从网络上下载文件时,若使用单线程实现,则下载完一个文件后才会开始下载下一个文件…

    多线程 2023年5月17日
    00
  • Entity Framework管理并发

    对于Entity Framework的并发管理,可以通过以下步骤进行设置和处理。 1. 设计数据库表 在设计数据库表时,需要考虑到并发操作可能会导致数据冲突的情况。可以为需要进行并发管理的数据表添加一个行版本号列。每次更新数据时自动将该列的值增加1。 以下为创建一个包含行版本号的记录的示例: CREATE TABLE Employee ( Id INT PR…

    多线程 2023年5月16日
    00
  • 详解利用redis + lua解决抢红包高并发的问题

    下面是针对“详解利用redis + lua解决抢红包高并发的问题”的完整攻略。 1. 背景 在高并发场景下,如何保证抢红包的公平、高效、正确是一个非常重要的问题。该问题可以采用一种使用 Redis 和 Lua 编写的分布式锁协议解决。 2. Redis 与 Lua Redis 是一个内存型数据库,支持多种数据结构,如字符串、列表、哈希、集合、有序集合等。Lu…

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