Python并发:多线程与多进程的详解

Python并发:多线程与多进程的详解

一、概述

在Python中进行并发编程可以使用多线程和多进程,两者都可以利用多核CPU提高程序的性能。多线程主要用于IO密集型任务,多进程则适用于CPU密集型任务。

二、多线程

1. 创建线程

在Python中创建线程可以使用threading库,具体步骤如下:

import threading

def func():
    print("Hello World!")

t = threading.Thread(target=func)
t.start()

2. 传递参数

需要注意的是,如果要传递参数,需要将参数放在一个元组中传递:

import threading

def func(num):
    print(f"num is {num}")

t = threading.Thread(target=func, args=(10,))
t.start()

3. 线程锁

多线程需要考虑线程安全的问题,可以使用线程锁进行控制:

import threading

num = 0
lock = threading.Lock()

def func():
    global num
    for i in range(100000):
        lock.acquire()
        num += 1
        lock.release()

t1 = threading.Thread(target=func)
t2 = threading.Thread(target=func)
t1.start()
t2.start()

t1.join()
t2.join()

print(num)

上述代码创建了两个线程,对共享的变量num进行加一操作,通过线程锁的方式保证了线程安全的问题。

4. 示例说明

下面给出一个常见的多线程示例:爬虫。

import requests
import threading

def download(url):
    r = requests.get(url)
    print(f"downloaded {len(r.content)} bytes from {url}")

urls = [
    "https://www.baidu.com",
    "https://www.sogou.com",
    "https://www.douban.com",
    "https://www.zhihu.com"
]

threads = []
for url in urls:
    t = threading.Thread(target=download, args=(url,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print("All downloads finished.")

上述代码创建了多个线程,对多个URL进行下载操作,通过多线程的方式提高了下载的效率。

三、多进程

1. 创建进程

在Python中创建进程可以使用multiprocessing库,具体步骤如下:

import multiprocessing

def func(num):
    print(f"num is {num}")

p = multiprocessing.Process(target=func, args=(10,))
p.start()

2. 进程池

如果需要创建多个进程,可以使用进程池,将任务放入进程池中:

import time
import multiprocessing

def do(num):
    time.sleep(1)
    return num * num

if __name__ == '__main__':
    p = multiprocessing.Pool(4)
    nums = [1, 2, 3, 4, 5]
    results = p.map(do, nums)
    print(results)

上述代码利用multiprocessing.Pool()函数创建了进程池,并将任务放入进程池中,通过map()函数来获取每个进程的结果。

3. 示例说明

下面给出一个用于计算圆周率的多进程示例。

import random
import math
import multiprocessing

def pi(n):
    count = 0
    for _ in range(n):
        x, y = random.uniform(-1, 1), random.uniform(-1, 1)
        if math.sqrt(x ** 2 + y ** 2) < 1:
            count += 1
    return 4 * count / n

if __name__ == '__main__':
    with multiprocessing.Pool() as pool:
        results = pool.map(pi, [1000000]*10)
    print(sum(results) / len(results))

上述代码创建了多个进程,利用蒙特卡罗法进行圆周率的计算。可以看出,多进程能够在较短时间内完成较复杂的任务。

四、总结

本文介绍了Python中的多线程和多进程,并通过示例说明了它们的具体用法。在实际应用中,应根据任务类型和CPU核心数量等条件选择适合的并发方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python并发:多线程与多进程的详解 - Python技术站

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

相关文章

  • C#并发编程入门教程之概述

    针对“C#并发编程入门教程之概述”,我的攻略如下: C#并发编程入门教程之概述 简介 C#并发编程是一种在多个线程中共享数据、协调和同步操作的编程方式。在多任务系统和多核处理器上,使用并发编程可以提高系统使用率和性能。 本教程旨在介绍C#并发编程的基础知识、相关概念和常用技术,包括线程、锁、并发集合等等。 基础知识 线程 线程是操作系统进行任务调度的最小单位…

    多线程 2023年5月16日
    00
  • 举例说明Java多线程编程中读写锁的使用

    Java多线程编程中读写锁的使用可以在读多写少的情况下提高性能,下面详细讲解读写锁的使用过程和需要注意的事项。 什么是读写锁 读写锁(ReadWriteLock)是Java并发包中的一个重要组件,其实现了一个单独实例可以支持多个线程在同一时刻读取共享数据,而对于写操作,同一时刻只允许一个线程进行,从而提高数据的并发性和性能。 读写锁有两个锁,一个读锁和一个写…

    多线程 2023年5月16日
    00
  • Java多线程中断机制三种方法及示例

    先给大家介绍一下这篇攻略的目录: 目录 Java多线程中断机制简介 interrupt()方法 示例1:线程在睡眠时被中断 示例2:线程使用while循环时被中断 isInterrupted()方法 示例3:判断是否被中断 interrupted()方法 示例4:判断是否被中断并清除中断标志位 现在我们来一步步讲解每个部分的内容。 Java多线程中断机制简介…

    多线程 2023年5月17日
    00
  • 10张图总结出并发编程最佳学习路线

    首先我们需要了解什么是并发编程。并发编程是指同时执行多个线程或者进程来达到提高系统性能和处理能力的目的。但是并发编程存在着很多问题,例如资源竞争、死锁、协调通信等问题,因此在学习并发编程时需要掌握一些基本的知识和技能。 以下是“10张图总结出并发编程最佳学习路线”的完整攻略: 1. 并发模型 在学习并发编程之前需要了解并发模型的概念和各种模型的区别以及优劣,…

    多线程 2023年5月16日
    00
  • 详解在Java中如何创建多线程程序

    当需要处理复杂任务时,使用多线程可以提高程序的并发性以及响应速度。在Java中,创建多线程程序有两种方式:继承Thread类和实现Runnable接口。下面将会详细介绍这两种方式的创建方法: 使用Thread类创建多线程程序 创建多线程程序的第一种方式是继承Thread类并重写run()方法。run()方法包含需要在多线程中执行的代码,这些代码将在单独的线程…

    多线程 2023年5月17日
    00
  • Java并发工具类Exchanger的相关知识总结

    Java并发工具类Exchanger的相关知识总结 Exchanger是什么? Exchanger是Java的并发工具类之一,用于实现两个线程之间数据的交换。例如:当线程A需要线程B的数据,线程B需要线程A的数据时,它们可以利用Exchanger来实现数据的交换。 Exchanger提供了以下两个方法: exchange(V x):该方法用于通过Exchan…

    多线程 2023年5月17日
    00
  • HTML5之多线程(Web Worker)

    HTML5的一个重要特性是支持多线程(Web Worker),这使得在浏览器执行JavaScript代码时可以使用多个线程加快程序运行速度,提升用户体验。 前置知识 在介绍Web Worker之前,需要先了解下JavaScript中的单线程和异步编程。JavaScript运行在浏览器端时只有一个主线程,在这个主线程中执行各种操作,包括用户交互和执行代码等等,…

    多线程 2023年5月17日
    00
  • SpringBoot 多任务并行+线程池处理的实现

    SpringBoot 多任务并行+线程池处理的实现攻略 简介 SpringBoot 是一个非常流行的Java Web开发框架,其中的并行执行多个任务非常实用。通过使用 SpringBoot,多个任务可以同时在不同的线程中执行,使得程序效率更高、性能更好。本文将介绍如何使用 SpringBoot 对多个任务进行并行处理,并使用线程池处理,以提高程序的效率。 实…

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