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日

相关文章

  • PyQt5中多线程模块QThread使用方法的实现

    PyQt5中的QThread模块可以帮助开发者在GUI应用中实现多线程操作,从而提高应用的响应速度和并发能力。在本文中,我们将分享如何使用QThread模块来实现多线程,包括以下内容: 创建QThread对象并构建多线程功能的线程类。 定义线程函数并将其连接到QThread对象的信号与槽机制。 演示如何使用QThread模块启动和停止线程。 1. 创建QTh…

    多线程 2023年5月16日
    00
  • Mysql事务并发脏读+不可重复读+幻读详解

    Mysql事务并发脏读+不可重复读+幻读详解 事务 数据库事务是指一系列的数据库操作,它们作为一个单独的工作单元执行,要么全部执行成功,要么全部执行失败,保证数据的一致性和可靠性,是数据库的一项非常重要的功能。 在Mysql中,如果想要执行一系列的操作能够作为一个事务,需要使用在InnoDB引擎下提供的BEGIN、COMMIT、ROLLBACK等SQL命令进…

    多线程 2023年5月17日
    00
  • Java多线程并发生产者消费者设计模式实例解析

    Java多线程并发生产者消费者设计模式是一种常见的并发编程模式,它可以让生产者不停地生产数据,消费者不停地消费数据,从而实现高效的数据处理。下面,我将分为以下几个步骤详细讲解Java多线程并发生产者消费者设计模式实例解析。 1.生产者消费者设计模式的原理 生产者消费者设计模式是一种基于阻塞队列的并发模式。它的基本思想是,将生产者线程和消费者线程分别放在不同的…

    多线程 2023年5月17日
    00
  • Java 多线程之两步掌握

    Java 多线程是 Java 常用的编程技巧之一,可以有效提高程序的并发性能。本文将介绍 Java 多线程的两步掌握,通过两个示例说明,让大家更好理解和掌握。 步骤一:创建线程 Java 多线程的核心是线程的创建。Java 中有两种方式创建线程:继承 Thread 类和实现 Runnable 接口。具体示例如下: 继承 Thread 类 public cla…

    多线程 2023年5月17日
    00
  • 15个Java线程并发面试题和答案

    针对“15个Java线程并发面试题和答案”的完整攻略,我会从以下几点进行讲解: 概述Java并发编程的基础知识; 解答15个与Java并发编程相关的面试题; 提供示例代码或实际场景说明。 1. Java并发编程基础知识 Java并发编程,是指在多个线程同时执行的情况下,协调这些线程之间的工作,保证并发的安全性与正确性。Java提供了多种并发编程的工具和方法,…

    多线程 2023年5月16日
    00
  • 基于多线程中join()的用法实例讲解

    基于多线程中join()的用法实例讲解 1. 关于join()方法 在Python多线程编程中,join()方法是常用的多线程同步方法之一。该方法的作用是等待子线程结束后,再继续执行主线程。 2. join()方法的用法示例 示例1:基本用法 import threading def task(): print("Child thread star…

    多线程 2023年5月17日
    00
  • python多线程semaphore实现线程数控制的示例

    下面我将为您详细讲解如何使用Python多线程Semaphore实现线程数控制。 什么是Semaphore Semaphore是一种并发控制机制,用于控制同时访问特定资源的线程数量。Semaphore维护一个内部计数器,该计数器表示可用资源的数量。当一个线程需要访问资源时,它先要向Semaphore请求许可,Semaphore会将计数器减1,然后线程可以访问…

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

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

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