Python并发编程基础

python3练习题:并发编程(21-25) #practice21:多线程 线程的定义 方法一:直接Thread()构造 方法二:构造Thread的子类 #多线程的使用 from urllib.request import urlretrieve import csv from xml.etree.ElementTree import ElementTree,Element from threading import... 阅读详情

多线程并发

Python的多线程并发是基于threading模块实现的,其核心原理是利用线程切换技术来实现CPU级别的并发执行。这种并发执行并不等同于多CPU的并行操作,而是在单个CPU上通过快速切换线程来模拟同时处理多个任务的效果。

示范

import threading

def print_numbers():
    for i in range(10):
        print(i)

def print_letters():
    for letter in 'asdfghjkl':
        print(letter)

# 创建两个线程
t1 = threading.Thread(target=print_numbers)
t2 = threading.Thread(target=print_letters)

# 启动线程
t1.start()
t2.start()

# 等待线程执行完毕
t1.join()
t2.join()

join() 解释

join() 在多线程编程中,是一个用来等待线程终止的方法。

join()方法是用来阻塞主线程,直到目标线程执行完毕。当调用一个线程对象的join()方法时,主线程会被挂起,直到该线程对象完成其执行。这是为了确保主线程能在所有子线程完成后再继续执行,特别是在需要汇总或处理由多个线程产生的结果时尤为重要。

import threading
import time

def worker():
    print("Worker started")
    time.sleep(2)  # 模拟耗时操作
    print("Worker finished")

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

print("Main thread is waiting for worker thread to finish")
t.join()  # 主线程等待子线程执行完毕
print("Main thread continues after worker thread has finished")

创建了一个名为worker的线程,它会在2秒后打印"Worker finished"。然后我们在主线程中调用了t.join(),这会导致主线程阻塞,直到worker线程执行完毕。输出结果如下:

Worker started
Main thread is waiting for worker thread to finish
Worker finished
Main thread continues after worker thread has finished

多CPU并行

在计算机系统中,多个CPU同时执行不同的任务,以提高系统的处理能力和效率。在Python中,可以使用multiprocessing模块来实现多CPU并行,其实也叫多进程。

示范

import multiprocessing

def worker(num):
    """线程函数"""
    print('Worker:', num)

if __name__ == '__main__':
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        p.start()

多协程

多协程是指在一个线程中运行多个协程,它们通过任务的暂停和恢复来避免线程切换的开销,并且减少了锁的使用。

示范

import asyncio

async def worker(num):
    """协程函数"""
    print('Worker:', num)
    await asyncio.sleep(1)  # 模拟耗时操作

async def main():
    tasks = []
    for i in range(5):
        task = asyncio.create_task(worker(i))  # 创建协程任务
        tasks.append(task)
    await asyncio.gather(*tasks)  # 并发执行协程任务

if __name__ == '__main__':
    asyncio.run(main())

async def

async def 用于声明一个异步函数,即协程函数。这种函数的定义与普通函数类似,但包含 async 关键字,表示该函数是一个协程函数。

await

它用于挂起当前协程的执行,直到等待的操作完成。

await作用如下:

  • 暂停执行:当协程遇到 await 表达式时,它会暂停当前的执行,让出控制权给事件循环。这样,其他协程或任务可以继续执行,从而实现并发。
  • 恢复执行:当 await 后面的表达式(通常是另一个协程或异步操作)完成后,原协程会恢复执行。
import asyncio

async def fetch_data():
    print('Start fetching data...')
    await asyncio.sleep(2)
    print('Data fetched')

async def main():
    task = asyncio.create_task(fetch_data())
    print('Do something else...')
    await asyncio.sleep(1)
    print('Waiting for data...')
    await task
    print('Data received')

asyncio.run(main())

定义了两个协程函数:fetch_data 和 main。fetch_data 模拟了一个耗时的异步操作,它使用 await 来暂停当前协程的执行,等待2秒钟。而 main 则创建了一个任务(Task),并在等待1秒后使用 await 等待该任务完成。当任务完成后,main 会继续执行并打印出 "Data received"。

Do something else...
Start fetching data...
Waiting for data...
Data fetched
Data received

三者对比

多线程

优点

线程的创建和切换成本相对较低,对于I/O密集型任务,多线程可以在等待I/O操作时释放GIL,使得其他线程得以执行,从而提高程序的整体效率。

缺点

由于Python的GIL(全局解释器锁),多线程在CPU密集型任务中可能无法充分利用多核CPU的优势,因为同一时刻只有一个线程能够执行Python字节码。

场景

适合I/O密集型任务,如文件读写、网络请求等。

多进程

优点

每个进程拥有自己的内存空间和解释器,不受GIL的限制,可以充分利用多核CPU的优势,适合执行CPU密集型任务。

缺点

进程间的通信和数据共享相对复杂,且进程的创建和管理成本高于线程。

场景

适合CPU密集型任务,如大规模数值计算、图像处理等。

多协程

优点

协程是一种用户态的轻量级线程,它们通过事件循环来调度,可以在单线程内实现高并发。协程的创建和切换成本非常低,对于IO密集型任务尤其高效。

缺点

协程虽然轻量级,但仍然受限于GIL,对于CPU密集型任务,单独使用协程可能无法发挥最大效能。

场景

适合IO密集型任务,如Web服务器、异步数据处理等。

所以,对于IO密集型任务,可以考虑使用多线程或协程,而对于CPU密集型任务,则推荐使用多进程。在某些情况下,还可以将多进程与协程结合使用,以充分利用CPU资源并获得极高的性能。

理解GIL

Python的全局解释器锁(Global Interpreter Lock,GIL)是CPython解释器(Python的默认实现)中的一个技术细节。GIL是一个互斥锁,它确保了同一时刻只有一个线程能够执行Python字节码。这意味着在多线程环境下,即使有多个CPU核心,也只能有一个线程在执行Python代码。

  1. 对CPU密集型任务的影响:

对于计算密集型任务,由于GIL的存在,多线程可能无法有效利用多核CPU,因为线程在执行时会互相竞争GIL,导致实际并行效果受限。

  1. 对IO密集型任务的影响:

对于I/O密集型任务,GIL的影响相对较小。当一个线程等待I/O操作完成时(如文件读写、网络请求等),它会释放GIL,允许其他线程执行。这样,在I/O等待期间,CPU可以被其他线程有效利用。

  1. 解决方案:

对于需要利用多核优势的计算密集型任务,推荐使用多进程(通过multiprocessing模块)而不是多线程。每个进程有自己的Python解释器和内存空间,因此不受GIL的限制。

  1. 与协程的关系:

协程是在单个线程内部进行调度的轻量级线程。尽管协程可以在等待I/O时让出控制权,但由于它们运行在同一个线程内,仍然受到GIL的限制。然而,协程可以通过asyncio库提供的机制高效地处理高并发的I/O任务。

python爬虫基础并发编程 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。在操作系统中,每启动一个应用程序其实就是OS开启了一个进程且为进程分类对应的内存/资源,应用程序的执行也就是进程在执行。狭义定义:一个正在运行的应用程序在操作系统中被视为一个进程举例: 我们有py1文件中和py2文件,两个文件运行起来后是两个进程。 阅读详情

相关推荐

Python入门实战:Python并发编程基础

1.背景介绍 本文将讨论并发编程的一些基础知识和理论,包括并发性、并行性、同步/异步、线程/进程、协程等。通过阅读本文,读者可以掌握并发编程的基本方法,并且学会在实际项目中运用这些方法解决问题。同时,本文还将探讨Python在并发编程领域的发展,以及Python在异步编程、分布式编程方面的应用案例。 2.核心

AI天才研究院 166

Python学习(1)- Python并发编程基础

下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。,都是我自己学习时整理的,希望可以帮到你,一起加油!😝有需要的小伙伴,可以。

程序员小麦的博客 1086

3、并发编程:从基础到Python实践

本博客全面探讨了并发编程的概念、历史与实际应用,重点解析了其在Python中的实现方式及挑战。内容涵盖并发编程的基础理论、历史发展、在不同领域的应用现状以及未来趋势。此外,还详细介绍了Python中并发编程的三种主要实现方法——线程、进程和异步I/O,分析了它们的优缺点及适用场景。博客还讨论了并发编程中常见的问题,如死锁、饥饿和竞态条件,并提供了解决方案。最后,深入讲解了Python特有的全局解释器锁(GIL)及其对并发编程的影响,以及如何通过高级应用(如并发数据结构设计、原子操作和并发服务器构建)提升程序

white的博客 98

Python中的并发编程(4):线程同步

要点 本章着重讲解,线程间的数据如何通同步,线程间的竞争机制,死锁和python原生提供的线程同步方法。 哲学家就餐问题 谈及线程竞争,同步问题,就不能不提到哲学家就餐问题。 引自维基百科 哲学家就餐问题(英语:Dining philosophers problem)是在计算机科学中的一个经典问题,用来演示在并发计算中多线程同步(Synchronization)时产生的问题...

长歌行 796

ISP 基础知识储备

ISP(image signal processing),图像信号处理芯片,在手机摄像头和车载摄像头等领域有着广泛应用,是图像信号处理的核心芯片。 ISP pipeline 流程图如下: 光线经过lens镜头,投射到sensor上,经过光电转换成模拟电信号,再由A/D转换成数字信号,交给ISP芯片进行一系列的处理,在LENS部分也需要进行镜头校正、颜色矫正等一些操作。 然后,得到的bayer ...

qq_39444290的博客 778

YOLO-FastestV2从零部署到移动端推理实战手册

本文详细介绍了YOLO-FastestV2从零开始的完整部署流程,涵盖环境搭建、模型训练、格式转换及移动端部署。通过实战步骤,指导开发者将这一轻量级目标检测模型成功部署到Android设备,实现实时推理。文章重点解析了PyTorch到NCNN的模型转换与优化,助力移动端AI应用开发。

l1k9j8h7g6的博客 668

Python面试题:网络编程和并发

会的小伙伴请在下方留言吧!^_^ 网络编程和并发(34题) 1:简述 OSI 七层协议。 2:什么是C/S和B/S架构? 3:简述 三次握手、四次挥手的流程。 4:什么是arp协议? 5:TCP和UDP的区别? 6:什么是局域网和广域网? 7:为何基于tcp协议的通信比基于udp协议的通信更可靠? 8:什么是socket?简述基于tcp协议的套接字通信流程。 9:什么是粘包...

记录与分享 1016

影刀RPA进阶:Excel多条件筛选与数据提取实战

本文详细介绍了如何利用影刀RPA实现Excel多条件筛选与数据提取的自动化。通过拆解文本、数值、日期及颜色筛选等核心指令,并结合实战案例,指导用户构建稳健的销售数据提取机器人,从而高效处理复杂数据报表,提升工作效率。

onion的博客 530

Python并发编程基础概念

操作系统负责管理进程的创建、调度和终止,并为每个进程分配适当的资源,如内存和 CPU 时间片。并发和并行都涉及多个任务的执行,但并发是指任务可以交替执行,共享系统资源,而并行是指任务同时进行,每个任务在独立的处理器核心上执行。串行则是按照严格的顺序依次执行任务。在阻塞操作中,调用者会一直等待被调用的函数返回结果,期间无法执行其他任务。而在非阻塞操作中,调用者可以立即返回,并通过轮询或回调等方式查询操作的状态或结果。而在异步操作中,调用者可以继续执行其他任务,通过回调函数或事件处理机制获取异步操作的结果。

AZURE060606的博客 436

Python爬虫实战:5分钟搞定Boss直聘数据抓取(附完整代理IP配置)

本文详细介绍了如何使用Python爬虫高效抓取Boss直聘的招聘数据,包括环境配置、反爬策略、数据采集与存储、数据分析等完整流程。通过实战案例,帮助开发者快速掌握招聘市场数据抓取技术,为职业决策提供数据支持。

weixin_30832143的博客 346

抖音直播小风车跳转企业微信全攻略:企业号申请+落地页配置详解

本文详细解析了抖音直播小风车跳转企业微信的全流程,包括企业号申请、小风车配置和落地页优化。通过实战指南,帮助企业高效实现私域流量沉淀,提升直播转化率,特别适合电商和营销从业者参考。

weixin_29289821的博客 613

python基础——并发编程

本部分开始对并发编程的学习1.串行(serial):一个CPU上,按顺序完成多个任务2 并行(parallelism):指的是任务数小于等于cpu核数,即任务真的是一起执行的3.并发(concurrency):一个CPU采用时间片管理方式,交替的处理多个任务。一般是是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)

ai12345678900008的博客 970

【机器人】线性方程最小二乘解法对机械臂DH参数进行标定

1.前言 看了一篇文章,觉得里面的DH参数标定法讲的很清晰,便使用Matlab复现了一下,效果还可以,特写此文记录。 2.原理 2.1.误差最佳值的最小二乘计算 有研究结果表明:几乎95%的机器人位置误差都是由机器人内部运动学的不准确描述引起的,所以对DH模型参数进行标定是很有必要的。 DH参数物理含义:选自《机器人学、机器视觉与控制-Matlab基础》 当DH参数确定后,我们...

要恰饭得嘛 1万+

并发编程基础:从线程到进程的Python实践

在现代编程中,并发编程是一项不可或缺的技能。无论是为了提升程序的运行效率,还是充分利用多核处理器的性能,掌握并发编程都能让你的代码更上一层楼。Python 提供了强大的工具,如threading和模块,让开发者能够轻松实现多线程和多进程编程。本文将围绕并发编程基础展开,从线程与进程的概念入手,逐步深入到如何在 Python 中使用threading模块实现多线程,以及使用模块实现多进程。文章将通过通俗易懂的语言、清晰的代码示例和实际应用场景,帮助初学者快速入门,同时为进阶读者提供实用的技术参考。

吴师兄大模型的博客 1284

Excel VBA--按某一列拆分数据到多个文件

首先,将需要拆分的sheet命名为“明细”,接下来运行此代码,按提示操作即可。 在这里插入代码片 Sub chaifen() '定义变量类型 Dim sht, sh1, sh2 As Worksheet Dim k, i, j As Integer Dim irow As Integer Dim col As Integer Dim str As String '程序开始是要求输入按哪一列拆分数...

weixin_43650026的博客 5873

SAP 销售订单BOM使用场景简介

通常在MTO的生产场景中,我们会根据已创建的SO去展开BOM去驱动生产,如果我们生产地产品BOM是通用性的通常我们用标准BOM的方式就可以实现,但是实际在生产过程中往往不会这样,不同的客户对某些物料的规格就不相同,就会涉及产生不同的BOM,但是该客户的产品又不存在通用性,这个时候就会引入概念就是销售订单BOM,先有销售订单然后根据销售订单+行项目创建BOM。销售BOM:根据销售订单号+行项目号创建的BOM,是根据特定的销售订单或者可以理解为特定的客户创建的BOM。

我小时候很黑的博客 4220

python并发编程基础

并发编程基础 网络编程,了解网络相关的知识点并且要知道几乎所有网络的通信本质上都是通过socket模块实现。例如:网站、网络爬虫。 并发编程,提升代码执行的效率。原来代码执行需要20分钟,学习并发编程后可以加快到1分钟执行完毕。 概要: 初识进程和线程 多线程开发 线程安全 线程锁 死锁 线程池 1.进程和线程 例如: 一个工厂,至少有一个车间,一个车间中至少有一个工人,最终是工人在工作。 一个程序,至少有一个进程,一个进程中至少有一个线程,最终是线程在工作。 上述串行的代码示例就是一个程序

qq_37049812的博客 303

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【Python】【并发编程】基础基础基础基础知识

本文系统介绍了Python中的并发编程模型,包括线程、进程和协程三种实现方式。首先阐述了串行、并行和并发的概念区别,然后详细讲解了线程的创建、同步机制(互斥锁、信号量、事件)、GIL问题以及生产者消费者模式。接着分析了进程的特点、创建方法、进程间通信(Queue、Pipe、Manager)和进程池的使用。最后探讨了协程的核心原理,通过asyncio模块实现异步IO,并比较了协程与线程、进程的优缺点。文章采用大量代码示例演示了各种并发技术的实际应用,特别强调了不同场景下的技术选型建议...

chenchenyyrr的博客 1996

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Python编程-并发编程基础梳理与高级特性案例讲解

互斥锁(Mutex)是一种用于多线程编程的同步机制,用于确保在任何时刻只有一个线程可以访问共享资源,从而避免多个线程同时修改共享资源而导致的数据竞争和不一致性问题。线程首先尝试获取互斥锁。如果当前没有其他线程持有该锁,则获取成功,线程可以进入临界区(访问共享资源)。如果有其他线程已经持有该锁,则获取失败,线程进入阻塞状态等待。当线程无法获取互斥锁时,它会进入阻塞状态,等待互斥锁的释放。在大多数情况下,线程在阻塞状态会暂时放弃 CPU 时间片,直到互斥锁被释放并且线程重新获得调度才能继续执行。

m0_74220316的博客 1137

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python基础—并发编程

广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。在操作系统中,每启动一个应用程序其实就是OS开启了一个进程且为进程分类对应的内存/资源,应用程序的执行也就是进程在执行。狭义定义:一个正在运行的应用程序在操作系统中被视为一个进程举例: 我们有py1文件中和py2文件,两个文件运行起来后是两个进程。

飞得更高肥尾沙鼠 599

full stack python_python_fullstack基础(十八)-并发编程

并发编程一、进程1、理论背景①操作系统背景手工操作—穿孔卡片原理:用户独占计算机,CPU等待手工操作,资源利用和CPU利用效率极低批处理—磁带处理、批处理系统原理:主机与输入机之间增加磁带存储设备,使得计算机可以自动将磁带读入计算机,成批完成作业分类:脱机批处理系统、联机批处理系统多道程序系统原理:指允许多个程序同时进入内存并交替运行特点:宏观上并行、微观上串行分时系统原理:把处理机的运行时间分成...

weixin_39922476的博客 232

Python基础之并发编程

在 Python 学习的过程中,并发编程有些概念我们可能在理解上有些模糊,这些概念却很重要。下面我讲逐一解释一下并发和并行,同步和异步,阻塞和非阻塞。 并发&并行 并发:在 OS 中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。简言之,是指系统具有处理多个任务的能力。 并行:当系统有一个以...

PythonGo 355

python并发编程之基础

1.并发编程基础 进程基础知识 程序是什么? 程序就是一堆文件 进程是什么? 进程就是一个正在执行的文件/程序. 进程被谁执行? CPU来运行程序 操作系统起到调度作用,将磁盘上的程序加载到内存,然后交由CPU去处理.一个CPU正在运行的一个程序,就叫开启了一个进程 操作系统 操作系统的定义 操作系统是存在于硬件于软件之间,管理,协调,控制软件与硬件的交互. 操作系统的作用 如...

weixin_30367169的博客 103
上一篇: 即席查询框架怎么选?
下一篇: 提升爬虫效率:多线程,多进程,多协程
大数据左右手
博客等级 码龄9年 475粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值