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核心数量等条件选择适合的并发方式。

阅读剩余 71%

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

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

相关文章

  • Erlang中的并发程序简介

    Erlang中的并发程序简介 什么是Erlang并发程序? Erlang是一种面向并发性的编程语言,它通过基于Actor模型来处理并发。在Erlang中,每个进程都是Actor,这些进程可以相互通信,并且不会破坏彼此的状态。Erlang的并发性能力非常强大,因为它是并行执行的,并且进程之间不会出现竞争条件或死锁问题。 Erlang并发程序的基本结构 在Erl…

    多线程 2023年5月17日
    00
  • Java让多线程按顺序执行的几种方法

    Java中多线程是独立运行的,并发执行,遵循自己的时间表。但是,有时候需要按照特定的顺序来执行多个线程,以便其运行方式与编程要求相适应。本文将介绍Java让多线程按顺序执行的几种方法。 方法1.依靠join()方法 在Java中,线程可以使用join()方法等待另一个线程的完成,直到当前线程已经结束执行或等到timeout毫秒。这个方法只能在共享同一个对象的…

    多线程 2023年5月17日
    00
  • Java httpClient连接池支持多线程高并发的实现

    Java httpClient是一种开源的基于Http的请求和响应类型,它可以通过连接池技术适用于高并发的请求场景,下面是httpClient连接池支持多线程高并发的实现攻略: 1. 引入依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <art…

    多线程 2023年5月16日
    00
  • Java多线程之Worker Thread模式

    Java多线程之Worker Thread模式 什么是Worker Thread模式 Worker Thread模式是一种有效的多线程设计模式,用于在并发环境中处理多个请求,提高应用的响应性能和并发能力。 在Worker Thread模式中,主线程负责接收任务,把任务交给线程池中的工作线程去处理,主线程不断地接收任务,工作线程不断地从队列中取出任务并执行,一…

    多线程 2023年5月17日
    00
  • 一篇文章带你入门java多线程

    一篇文章带你入门Java多线程 前言 Java多线程是Java语言的一个非常重要的特性,它可以让我们更好地利用计算机多核的优势,加快程序的运行效率。本文将带你了解Java多线程的基本概念和应用,让你迈出入门的第一步。 Java多线程的基本概念 线程 Java线程是程序中执行的最小单元,一个程序可以有多个线程同时执行。Java线程通过Java.lang.Thr…

    多线程 2023年5月17日
    00
  • Java中多线程的ABA场景问题分析

    Java中多线程的ABA场景问题分析 ABA场景问题简介 多线程中,如果一个线程在读取一个共享变量时,另一个线程把它修改为另外一个值,再修改回原来的值,这时第一个线程可能会检查到期望的值,但是并没有发现这个值已经被修改过,这种情况就叫做ABA场景问题。 ABA场景问题如何解决 Java中提供了一个原子变量类AtomicStampedReference来解决A…

    多线程 2023年5月16日
    00
  • GoLang并发机制探究goroutine原理详细讲解

    GoLang并发机制探究goroutine原理详细讲解 什么是goroutine goroutine 是Go语言中的一种轻量级线程,能够在用户态(User Space)进行创建和销毁,不需要操作系统提供的线程管理和调度,因此比传统线程的创建、销毁和轮转开销更小,同时能够高效地利用多核CPU性能。 Go语言中的协程(goroutine)有着更加灵活的调度和更少…

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

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

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