Python中并发方面的差异

Python与C线程对比:GIL限制、性能差异与并发编程实战 并发编程是现代软件开发的核心概念,旨在通过同时执行多个任务来提升程序效率。其基本原理是利用多线程或多进程来分解任务,从而充分利用多核CPU资源或应对I/O等待。在技术价值上,并发能显著提升程序吞吐量和响应速度,尤其适用于网络服务、数据处理等场景。然而,不同语言对并发的实现存在根本差异,例如全局解释器锁(GIL)这一机制就深刻影响了Python多线程在CPU密集型任务中的表现。相比之下,C语言的线程更贴近操作系统,能实现真正的并行。本文聚焦于Python与C的线程模型对比,深入剖析GIL的设计哲学、互斥锁与条 阅读详情

人们可能会想象Python才刚刚引入这些概念或能力,因为随着Python 3的发布,我们听到了很多关于异步操作和并发的新趋势。

许多新手可能认为使用asyncio 是执行并发和异步活动的唯一实用方法。本文将讨论我们如何在Python中实现并发及其好处或坏处。

线程和多线程

线程在Python中已经存在很长时间了。因此,由于线程的存在,我们可以同时执行多个操作。

不幸的是,CPython ,一个典型的Python主线版本,仍然使用全局解释器锁 (GIL),这使得多线程应用–现今常见的实现并行处理的方法–不是很理想。

Python引入了GIL ,以使CPython的内存处理更易于管理与C的集成(例如,扩展)。

GIL 是一种锁定机制,即Python解释器只能同时运行一个线程。Python的byte 代码永远只能由一个线程同时执行。

示例代码:

import threading
import time
import random
def worker(num):
    sec = random.randrange(1, 5)
    time.sleep(sec)
    print("I am thread {}, who slept for {} seconds.".format(num, sec))
for i in range(3):
    t = threading.Thread(target=worker, args=(i,))
    t.start()
print("Completed!")

输出:

Completed!
I am thread 1, who slept for 3 seconds.
I am thread 3, who slept for 2 seconds.
I am thread 4, who slept for 4 seconds.

进程和多进程

多进程利用了许多CPU。我们可以有效地同时进行几个任务,因为每个CPU都是并行运行的。对于那些受CPU约束的工作,多处理是你想使用的。

Python引入了multiprocessing 模块来实现并行化,如果你使用过线程,会感觉非常相似。

示例代码:

import multiprocessing
import time
import random
def worker(num):
    sec = random.randrange(1, 5)
    time.sleep(sec)
    print("I am process {}, who slept for {} seconds.".format(num, sec))
for i in range(3):
    t = multiprocessing.Process(target=worker, args=(i,))
    t.start()
print("Completed")

输出:

Completed
I am process 1, who slept for 1 seconds.
I am process 2, who slept for 2 seconds.
I am process 0, who slept for 3 seconds.

与其说是多线程,不如说是在你的CPU的不同核心上运行多个进程,这使我们的Python脚本更快。

异步和asyncio

在同步操作中,任务是同步进行的,一个接一个。然而,在异步操作中,任务的开始可能完全是相互独立的。

一个async 任务可能开始并继续运行,而执行则切换到另一个活动。另一方面,异步任务经常在后台执行,不会阻塞(让执行者等待完成)。

除了其他有价值的功能外,asyncio 还提供了一个事件循环。事件循环监控各种I/O事件,切换到准备好的任务,并暂停等待I/O的任务。

因此,我们不会将时间浪费在未完成的项目上。

示例代码:

#Python小白学习交流群:711312441
import asyncio
import datetime
import random
async def my_sleep_func():
    await asyncio.sleep(random.randint(0, 5))
async def displayDate(num, loop):
    endTime = loop.time() + 60.0
    while True:
        print("Loop: {} Time: {}".format(num, datetime.datetime.now()))
        if (loop.time() + 1.0) >= endTime:
            break
        await my_sleep_func()
loop = asyncio.get_event_loop()
asyncio.ensure_future(displayDate(1, loop))
asyncio.ensure_future(displayDate(2, loop))
loop.run_forever()

如果我们走过上面的代码片断:

  • 我们有一个async 函数displayDate ,它接受一个数字和事件循环作为参数。
  • 上述函数有一个无限循环,60秒后停止。但在这60秒内,它重复地打印出时间并打盹。
  • await 函数可以等待其他async 函数完成。
  • 我们将该函数传递给事件循环(使用ensure_future 函数)。
  • 我们开始运行事件循环。

每当调用await ,asyncio 明白该函数可能需要一些时间。当asyncio 注意到停止的函数的I/O已经准备好了,它就恢复进程。

现在,问题是,在这三种形式的并发中,我们需要使用什么?我们可以注意到以下几点来帮助我们决策:

  • 对CPU绑定的操作使用多处理。
  • 对I/O Bound、快速I/O和有限的连接数使用多线程。
  • 对于I/O绑定、慢速I/O和许多连接,使用异步IO。
  • asyncio/await 在Python 3.5和更高版本上工作。

我们也可以参考下面的伪代码:

if io_bound:
    if io_very_slow:
        print("Use asyncio")
    else:
        print("Use multithreading")
else:
    print("multiprocessing")
对比Golang爬虫和Python爬虫:技术选用、性能差异和应用领域评估 在选择爬虫工具时,往往会遇到一个问题:是选择使用Python编写的爬虫框架,还是选择使用Go语言编写的爬虫框架?本文将从技术选型、性能差异和应用场景三个方面进行对比分析,帮助读者更好地选择适合自己需求的爬虫工具。本文从技术选型、性能差异和应用场景三个方面对Golang爬虫与Python爬虫进行了详细的对比分析。下面是使用Python和Go语言编写的一个简单的爬虫示例,借此展示两者的差异。Golang爬虫与Python爬虫的对比:技术选型、性能差异和应用场景分析。 阅读详情

相关推荐

不同语言的并发模型对比:Go、Java与Python

轻量性:Go goroutine < Python 协程 < Java 线程 < Python 进程。多核利用:Go 与 Java 原生支持多核;Python 需依赖多进程。同步方式:Go 倡导“通过通信共享内存”;Java/Python 线程依赖锁。最佳场景Go:高并发网络服务、微服务、云原生系统。Java:企业级应用、复杂并发逻辑、事务处理。Python:I/O 密集型(协程)、数据计算(多进程)。Go。

lpfasd123的博客 1185

Python 中并发方面的差异

在上面的代码片段中,我们定义了一个名为displayDate的异步函数,它接收一个数字和事件循环作为参数。事件循环监视各种I/O事件,切换到准备就绪的任务,并暂停等待I/O的任务。不幸的是,CPython(典型的主流Python版本)仍然使用全局解释器锁(GIL),这使得多线程应用(目前常用的实现并行处理的方法)不太理想。在同步操作中,任务按顺序进行,一个接一个地执行。与多线程不同,我们使用多个在CPU的不同核心上运行的进程,这使得Python脚本更快。因此,我们不会浪费时间在未完成的任务上。

迹忆客 161

Python与Golang:比较与对比

相比之下,Python的并发支持相对较弱。此外,Golang还有一些知名的第三方库和框架,如Gin、Echo和MongoDB驱动等,可以满足许多常见的开发需求。此外,Golang还有一些知名的第三方库和框架,如Gin、Echo和MongoDB驱动等,可以满足许多常见的开发需求。Python和Golang(Go语言)是两种备受欢迎的编程语言,它们在许多方面都有相似之处,但也存在一些显著的区别。Python和Golang(Go语言)是两种备受欢迎的编程语言,它们在许多方面都有相似之处,但也存在一些显著的区别。

ZwqDatabase的博客 353

python进阶08并发之四map, apply, map_async, apply_async差异

原创博客地址:python进阶08并发之四map, apply, map_async, apply_async差异 差异矩阵 python封装了4种常用方法,用于实现并发 其差异如下 Multi-args Concurrence Blocking Ordered-results map no yes yes yes apply yes no yes no map_async no yes no ..

江州司马 7037

宇树机器人G1二次开发:语音对话、打断与激活功能实现指南

宇树机器人G1是一款功能强大的四足机器人,其开放的SDK和API为开发者提供了广阔的二次开发空间。其中,语音交互是提升机器人智能化水平和用户体验的关键功能。本文将详细介绍如何在宇树机器人G1上进行二次开发,实现。语音打断允许用户在机器人说话时随时中断并输入新指令,这是提升交互自然度的关键功能。三大核心功能,帮助你构建更自然、更智能的人机交互系统。语音识别是将用户的语音输入转换为文本的过程。识别文本后,需要理解用户意图并生成回复。将文本回复转换为语音输出。

m0_52645558的博客 666

endnote让参考文献整整齐齐

这篇文章主要是针对利用 endnote 插入参考文献时,参考文献第一行和后面的行对不齐的问题 下面是示意图 可以看到我们的参考文献对的整整齐齐的,比较好看。 下面介绍具体步骤 1、打开endnote。编辑我们使用的参考文献样式。我这儿是叫 ZZ_MODIFIED_GEEBINF 复制 2、找到布局,每个参考开头,将光标放在在参考开头后面,点插入字段,制表符 3、右下角悬挂式输出哪儿选择全部段...

雾隐雾现的至渝博客 5万+

【Python面试题】ASGI和WSGI的区别,以及在并发性能上有多大的差异?

区别的本质在于并发模型:wsgi:同时阻塞,一个请求占用一个线程或者进程,并发提升依赖堆机器和worker,内存开销大,不支持websocketasgi:基于时间循环和协程,IO等待时间能让出执行权,单进程就能管理成千上万链接,内存成本低,天然支持websocket和HTTP/2.性能差异在IO密集或长连接场景下,ASGI可以比WSGI搞出数倍甚至一个数量级的吞吐,并且为延迟更稳定;但是在CPU密集型任务上,两者相差不多,主要还是靠多进程扩展风险。

HelloFif的博客 726

快衰落、慢衰落,平坦衰落、频率选择性衰落

目录一、大尺度衰落和小尺度衰落二、平坦衰落和频率选择性衰落1.反射墙、固定天线模型2.相干带宽和时延扩展三、快衰落和慢衰落1.反射墙、运动天线模型2.相干时间和多普勒扩展四、联系总结 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、大尺度衰落和小尺度衰落 移动无线信道的主要特征是信道强度关于时间和频率的变化,大致分两种: 大尺度衰落: .

weixin_45662974的博客 3万+

MQTT客户端性能对比:Python Paho与C Paho在高并发场景下的可靠性差异分析

MQTT作为轻量级的物联网消息传输协议,其核心价值在于为设备间通信提供可靠、高效的异步消息传递机制。协议通过QoS等级、持久会话等设计,确保消息在不可靠网络环境下的可靠传输。在物联网、金融交易等对数据完整性要求极高的场景中,客户端库的实现质量直接影响系统稳定性。本文聚焦于高并发场景下的消息可靠性问题,通过对比Python Paho与C Paho客户端库的架构差异,深入分析线程模型、内部队列机制等底层原理。测试表明,在消息涌入速度超过处理能力的背压情况下,Python客户端因GIL限制和消费速度不匹配可能出现

weixin_33754065的博客 387

超越界面设计:GUI Guider与LVGL在STM32F103上的系统集成与架构思考

本文探讨了GUI Guider与LVGL在STM32F103微控制器上的系统集成与架构设计,重点分析了工程模块化组织、内存管理优化、硬件驱动接口设计以及FreeRTOS多任务集成。针对STM32F103ZET6的资源限制,提供了实用的移植策略和性能优化方案,帮助开发者构建高效、可维护的嵌入式GUI系统。

j2k3l4的博客 923

2022-04-06 RK3566 上调试百兆以太网卡YT8512C 调试记录

一、原理图 二、dts &gmac1_clkin{ clock-frequency = <50000000>; status = "okay"; }; &gmac1 { phy-mode = "rmii"; clock_in_out = "input"; snps,reset-gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>; snps,reset-active-low; sn...

海月汐辰 1万+

python中UDP基于套接字编程,并发的TCP与UDP编程,TCP与UDP的差异。

菩提本无根,明镜亦非台 基于UDP协议的套接字通信: 1.UDP是无连接的,先启动那一端都不会报错。 UDP服务端: ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送) ss.close() # 关闭服务器套接字 UDP客户端: cs = socket()

零基础学习Python的博客 434

LabVIEW内存泄漏诊断与优化:从报错到高效运行

本文深入探讨LabVIEW内存泄漏的诊断与优化方法,从理解内存泄漏本质到使用专业工具链进行问题定位,再到高频场景的解决方案和高级优化策略。通过实战案例展示如何解决工业数据采集系统中的内存不足问题,帮助开发者提升LabVIEW应用的稳定性和效率。

moon9的博客 198

Python(19)Python并发编程:深入解析多线程与多进程的差异及锁机制实战

‌并发编程‌是提升程序性能的关键技术,根据2023年PyPI官方统计,超过78%的Python项目涉及并发处理需求。Python受GIL(全局解释器锁)限制,选择正确的并发方案尤为重要: ‌CPU密集型任务‌:图像处理/科学计算等(适合多进程) ‌IO密集型任务‌:网络请求/文件读写等(适合多线程) ‌实时响应需求‌:GUI应用/游戏开发等 ‌资源竞争管理‌:数据库操作/共享内存访问

优快云博客专家,领域包括但不限于:AI、大数据、Python、架构师,有合作、课程、问题、疑惑请私信博主 1438

反向代理的隐形陷阱:为何你的HTTPS请求会降级为HTTP?

本文深入探讨了Nginx反向代理中HTTPS降级为HTTP的隐形陷阱及其安全风险,分析了五大降级诱因,包括协议信息丢失、重定向配置错误等,并提供了完整的防御性配置方案和实战指南,帮助开发者确保Web应用的安全性。

kotlin6android的博客 453

【WRF模拟】如何查看 WPS 的输入静态地理数据(二进制格式)?

如何查看 WPS 的输入静态地理数据(二进制格式)?

WW、forever的博客 633

python socket udp并发_python中UDP基于套接字编程,并发的TCP与UDP编程,TCP与UDP的差异。...

菩提本无根,明镜亦非台基于UDP协议的套接字通信:1.UDP是无连接的,先启动那一端都不会报错。UDP服务端:ss = socket() #创建一个服务器的套接字ss.bind() #绑定服务器套接字inf_loop: #服务器无限循环cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)ss.close() ...

weixin_27734811的博客 310

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

python 多线程并发 写文件_Python3并发写文件与Python对比

这篇文章主要介绍了Python3并发写文件原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下使用python2在进行并发写的时候,发现文件会乱掉,就是某一行中间会插入其他行的内容。但是在使用python3进行并发写的时候,无论是多进程,还是多线程,都没有出现这个问题,难道是python3的特性吗?import timeimport osimp...

weixin_39755952的博客 648

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

python sleep和wait_一起学并发编程 - sleep与wait的差异

在JAVA的学习中,不少人会把sleep和wait搞混,认为都是做线程的等待,下面主要介绍下这俩者是什么,及了解它们之间的差异和相似之处。一般差异简单来说,wait()是一个用于线程同步的实例方法。因为定义在java.lang.Object上,所以它可以在任何对象中调用, 但前提条件是在同步代码块中调用,同时释放对象上的锁,以便另一个线程可以跳入并获取锁。而Thread.sleep()是可以从任何...

weixin_39829073的博客 965

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Python【第十八课】并发编程:深入解析多线程与多进程的差异及锁机制实战

文件/网络操作 → 多线程数学计算/数据处理 → 多进程混合型任务 → 线程池+进程池组合。

2501_92499985的博客 1240

python中的并发

python中的并发,CPU密集型任务是说程序中存在大量的计算操作,CPU在程序运行期间处于忙碌状态,因为计算量太大导致程序运行的时间过长,此时提升CPU的性能可以缩短程序的运行时间。对于CPU密集型任务,使用并行机制来缩短程序的运行时间,程序的运算量可以看作是固定的,程序同时使用的CPU越多,总的运算量减少的就会越快,进而程序的运行时间就会缩短。python中使用thread和async来支持并发,因为GIL的限制,python在使用这两个功能时也还是单线程执行的,

方方洛的博客 3021

96、Python并发编程:三个核心概念及Python并发编程模型

本文简单介绍了程序到执行的一个大概的过程,辨析了程序、进程、线程的概念,同时简单介绍了Python中的并发编程模型。

南宫理的日知录 1400

python 并发编程

python 并发除了直接基于编译内核的 Stackless   python还有比较突出的一些例如gevent,eventlet greenlet等,主要概念是协程。 以下是用刷票(客户端)的例子,比多线程快n倍,不过还是不如Stackless:(ps:erlang并发还不如python 基于协程的Stackless) gevent效率要高于eventlet impor

Yatere的天平秤 1793

golang python解释器_实例Python并发编程

我们知道现在硬件飞速发展,多核CPU 成了标配。为了提高程序的效率,一个方面改变程序的顺序执行,用异步方式,防止由于某个耗时步骤,而影响后续程序的执行。另一个方面是采用并发方式执行,重复利用多核CPU优势加速执行。关于并发编程大家可能比较熟悉的是Golang的协程、通道和Node.js 的async.parallel异步并发编程。就并发编程来说,Python不是一门合适的语言,主要是Python有...

weixin_33893979的博客 253

从六个方面对比Go和Python的差异

您是否想过 Go 与 Python 之间的主要区别是什么?随着对软件开发人员的需求不断增加,选择哪种编码语言可能会很困难。​在此,我们将从六个方面对比Go和Python,探讨 Go 和 Python之间的差异。我们将讨论它们的特点、优缺点,以便您能做出明智的决定。Go语言和Python都有各自的优势,具体选择还是要看企业需求和实际使用情况。

2301_80240808的博客 2162

【转】Python几种并发实现方案的性能比较

http://www.cnblogs.com/sevenyuan/archive/2010/12/08/1900386.html Python几种并发实现方案的性能比较 转自:http://www.elias.cn/Python/PyConcurrency 1.  前言 偶然看到Erlang vs. Stackless python: a first benchma...

zj19880814的专栏 1199
上一篇: Python中的缓存库
下一篇: 用Python从URL中提取域名的方法
Python热爱者
博客等级 码龄7年 3057粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值