作者: AI最严厉的父亲

  • Rust 在 Python Web 应用中的性能魔力

    在一个多云的下午,小张正在使用 FastAPI 编写一个新的 Web 服务。虽然他知道 Python 为他提供了高效的开发速度和灵活性,但他仍然对性能有所担忧。当他在互联网上浏览时,他碰巧读到了 Rust 和 Python 的联合使用。他很好奇,于是决定进一步探索这种组合的性能潜力。

    1. 性能对比概览

    最近,有一个帖子比较了 FastAPI、Robyn 和 Gin 在处理 JSON 序列化时的性能。结果如下:

    • FastAPI (异步):每秒处理 13078.90 个请求。
    • Robyn (同步):每秒处理 38889.89 个请求。
    • Robyn (异步):每秒处理 23959.48 个请求。
    • Gin:每秒处理 68090.01 个请求。

    从上述数据可以看出,与 FastAPI 相比,Robyn 显著提高了性能。但 Gin 在此对比中仍然保持领先地位。

    2. Rust 为 Python 带来什么?

    Rust 是一个注重安全和性能的编程语言,它可以通过 FFI (外部函数接口) 被其他语言如 Python 调用。Python 可以利用 Rust 的高性能和多线程特性,同时保持其灵活性和开发效率。

    3. 如何结合 Rust 和 Python?

    Python 中有一个叫做 rust-cpython 的库,它允许 Rust 代码与 Python 进行互操作。使用这个库,你可以在 Rust 中编写高性能代码,并在 Python 中轻松调用它。

    4. 性能的真正瓶颈在哪里?

    尽管上述性能数据看起来很有吸引力,但值得注意的是,Web 应用的性能瓶颈可能并不总是在 JSON 序列化。数据库调用、网络 I/O 和其他外部服务都可能成为真正的性能杀手。因此,当考虑性能优化时,应该全面地分析应用的瓶颈。

    5. 结论

    Rust 无疑为 Python Web 开发带来了新的性能可能性。然而,是否值得将 Rust 引入你的 Python 项目,取决于项目的具体需求和性能目标。总的来说,这种组合无疑为 Python 的 Web 生态系统带来了新的活力。

  • Python GIL:解析并发、并行和线程安全

    一天,小明在调试他的 Python 多线程应用程序时,发现程序的并发性能并没有他预期的那么好。他很困惑,为什么在一个多核的 CPU 上,他的多线程程序似乎只在一个核上运行?他在网上搜索了一番,然后遇到了一个称为 "GIL" 的术语。小明很好奇 GIL 是什么,为什么它会影响 Python 的并发性能。于是,他深入研究了这个话题,并在这篇文章中与大家分享他的发现。

    1. 什么是 GIL?

    GIL,即全局解释器锁(Global Interpreter Lock),是 CPython(Python 的官方实现)中用于同步多线程的工具,确保在任何时候只有一个线程在执行。

    2. GIL 的存在意义

    Python 使用引用计数进行内存管理,当对象的引用计数降为0时,对象被销毁。但在多线程环境下,这样的引用计数是不线程安全的。为了解决这一问题,Python 引入了 GIL。

    3. Python 的并发和并行

    • 并发:多任务在一个时间段内交替执行,但任何时刻只有一个任务在执行。
    • 并行:多任务同时执行。

    GIL 确保了 CPython 的线程在单核 CPU 上是并发执行的,在多核 CPU 上由于 GIL 的存在,多线程仍然无法实现真正的并行。

    4. 线程安全和 GIL

    虽然 GIL 为我们解决了某些线程安全问题,但这并不意味着 Python 中的所有操作都是线程安全的。例如,执行 a += 1 这样的操作仍然可能需要多条字节码指令,并不能保证是原子操作。因此,在多线程环境下操作共享数据时,仍然需要加锁。

    5. GIL 对性能的影响

    GIL 的存在确实对多线程程序的性能产生了影响,尤其是在 CPU-bound 的程序中。但在 I/O-bound 的程序中,由于线程大部分时间都在等待 I/O,GIL 的影响较小。

    6. 如何绕过 GIL?

    • 使用多进程:Python 的 multiprocessing 模块可以帮助我们创建多个进程,每个进程都有自己的 Python 解释器和内存空间,因此不受 GIL 的影响。
    • 使用其他 Python 实现:如 Jython 或 IronPython,它们不受 GIL 的限制。
    • 使用外部工具:例如 Cython 或 C 扩展,它们可以在不受 GIL 影响的情况下运行。

    7. 结论

    虽然 GIL 对 Python 的并发性能有一定的影响,但了解其背后的原因和如何正确地在 Python 中使用多线程可以帮助我们更好地编写高性能的 Python 程序。

  • 适应国内网络环境:Python 项目的网络配置技巧

    当小明第一次尝试在自己的新项目中使用 pip 安装 Python 依赖时,他遭遇了让人沮丧的网络问题。下载速度缓慢、连接经常中断,让他对 Python 的开发产生了丝丝疑惑。但很快,他发现了一系列在国内网络环境下针对 Python 项目的网络配置技巧。在本文中,我们将一起探索这些实用的技巧。

    1. 如何选择合适的 pip 源

    Python 包的默认源是 PyPI,但由于众所周知的原因,国内用户下载可能会遭遇速度问题。幸运的是,国内有多个镜像站提供了 PyPI 的镜像服务,例如:

    • 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
    • 豆瓣:http://pypi.douban.com/simple/

    你可以临时更改源进行安装,使用 -i 参数:

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

    对于经常需要安装 Python 包的用户,建议在 pip.inipip.conf 中永久更改默认源。

    2. 代理配置

    有时,即使更换了国内源,由于某些特定的网络问题,仍然可能遭遇下载困难。这时,使用代理可能会帮助到你。

    可以通过以下命令设置代理:

    pip install some-package --proxy http://[user:password@]proxy.server:port

    如果你经常使用代理,同样可以在 pip 的配置文件中设置。

    3. 环境隔离

    多个 Python 项目可能需要不同版本的包。为了避免版本冲突,建议使用虚拟环境工具如 venvconda 来隔离每个项目的环境。

    例如,使用 venv

    python -m venv myenv
    source myenv/bin/activate

    使用 conda

    conda create --name myenv python=3.7
    conda activate myenv

    4. 安全考虑

    在使用 pip 安装 Python 包时,应注意包的来源。因为任何人都可以提交包到 PyPI,所以可能存在恶意代码。建议查看包的作者、来源、star 数等信息,确保安装的包是安全的。

    5. 部署技巧

    当你的 Python 项目准备好部署时,建议使用 requirements.txt 文件来固定依赖包的版本。这样,无论何时部署,都可以确保所有的依赖都是正确的版本。

    可以通过以下命令生成 requirements.txt

    pip freeze > requirements.txt

    在部署时,使用以下命令安装:

    pip install -r requirements.txt

    6. 结论

    在国内开发 Python 项目时,网络问题可能会成为一个挑战。但通过正确的配置和工具,你可以轻松地解决这些问题。希望本文为你在 Python 开发之旅中提供了有用的指导!

  • Python 包的可选依赖管理:了解 `extras_require`

    刚开始学 Python 的小张,热衷于编写自己的 Python 包并分享给大家。但在某天,他遇到了一个棘手的问题:如何为他的包管理不同的依赖?他不想让每个使用他包的用户都安装所有的依赖,只想根据使用情况来选择性地安装。在经过一番探索后,他终于找到了答案。本文将探讨 Python 包的 extras_require 功能,并解答与此相关的常见问题。

    1. 什么是 extras_require

    setup.py 文件中,extras_require 允许开发者为他们的包定义可选的依赖。这意味着用户可以选择性地安装这些依赖,而不是在安装包时安装所有的依赖。

    例如:

    setup(
        ...
        extras_require={
            'dev': ['pytest', 'sphinx'],
            'gui': ['PyQt5']
        }
    )

    这样,用户在安装包时可以通过以下方式来选择性地安装 devgui 的依赖:

    pip install your_package[dev]
    pip install your_package[gui]

    2. 安装 extras_require 是否会影响代码安装?

    答案是:不会。当安装包时,包内的所有代码都会被复制到目标位置,不管是否安装了 extras_require 指定的依赖。这意味着,即使用户没有安装可选依赖,与这些可选依赖相关的代码仍然会被安装。

    3. 主流做法是什么?

    业内标杆,例如 requests 库,通常将可选的功能相关代码单独放在一个模块或包中,并在这些代码中通过 try/except 语句来检查是否已安装相关依赖。

    例如,假设我们有一个与 PyQt5 相关的 gui 模块:

    try:
        import PyQt5
    except ImportError:
        raise ImportError("请安装 PyQt5 以使用 gui 模块")

    这样,当用户尝试导入 gui 模块但没有安装 PyQt5 时,会收到一个清晰的错误消息,告知他们需要安装 PyQt5

    4. 安装 extras_requireinstall_requires 有什么区别?

    install_requires 指定的是包的必要依赖,即用户在安装包时必须安装的依赖。而 extras_require 指定的是可选的依赖,用户可以选择性地安装。

    例如,如果我们的包必须依赖 numpy,但只在某些功能中使用 matplotlib,那么可以这样定义:

    setup(
        ...
        install_requires=['numpy'],
        extras_require={
            'plot': ['matplotlib']
        }
    )

    这样,用户在安装包时会自动安装 numpy,但只有当他们需要绘图功能时,才会选择性地安装 matplotlib

    5. 结论

    对于 Python 包的开发者来说,了解和正确使用 extras_require 可以提供更加灵活和用户友好的安装选项。同时,结合 try/except 语句,可以确保代码的鲁棒性,并为用户提供清晰的错误消息。

  • Python HTTP 请求的 SSL 与代理问题:一次全面的解读

    在日常开发中,HTTP 请求作为信息交互的基础,其稳定性和正确性至关重要。然而,当李华试图用 Python 发送一个 HTTP 请求时,他遇到了一个棘手的问题:经常出现的 SSL 错误和超时问题。作为一个热衷于开发的工程师,李华决定深入研究这个问题,并与社区分享他的解决方案。本文将全面解析 Python 在发送 HTTP 请求时可能遇到的问题,并提供有效的解决方案。

    1. 遇到的问题

    当使用 Python 的 requestshttpx 发送 HTTP 请求时,经常会出现以下问题:

    • SSL 错误
    • 超时
    • 代理设置影响

    许多开发者也经常遇到类似问题,感觉是 Python 版本或其网络库的问题。

    2. 深入了解 SSL 问题

    SSL 错误通常是由于证书验证失败导致的。Python 3.11 对证书的验证比较严格,因此可能会出现此类问题。

    解决方案:

    • 使用自定义的 sslcontext
    • 在请求时不校验证书:例如,httpx.get("https://example.org", verify=False)

    但这种方法可能会引发安全问题,因此在生产环境中需要谨慎使用。

    3. 超时问题的深入探讨

    超时问题可能有多种原因。首先,需要确定是连接超时还是读取超时。可以通过设置不同的超时时间来判断:

    • timeout=(0,5, 10) 可以帮助确定是否是连接超时
    • timeout=(10, 1) 可以帮助确定是否是读取超时

    其中,第一个元素是连接超时时间,第二个元素是读取超时时间。

    解决方案:

    • 根据具体的超时类型,调整对应的超时时间
    • 检查是否有代理或网络问题影响连接

    4. 代理问题

    代理问题是 Python HTTP 请求中常见的问题。很多时候,由于代理设置不当,导致请求失败或超时。

    解决方案:

    • 在请求时明确指定代理,例如:

      my_proxy = {‘https’: '127.0.0.1:7890'}
      requests.get(url, proxies=my_proxy)
    • 也可以直接在代码开头设置环境变量:

      os.environ['http_proxy'] = 'http://127.0.0.1:7890'
      os.environ['https_proxy'] = 'http://127.0.0.1:7890'

    5. 结论

    Python 在发送 HTTP 请求时可能会遇到多种问题,但只要深入了解背后的原因,并采取有效的解决方案,就能确保请求的稳定性和正确性。希望本文能为遇到类似问题的开发者提供帮助。

  • 如何打造自己的开发工具箱:一个深入探讨的教程

    当李华从业界前辈那里听说 JetBrains Toolbox 的时候,他的内心被深深吸引了。作为一个对编程充满热情的初学者,李华对此表示了浓厚的兴趣。他想要为自己在 Python 上制作的各种小工具整合成一个完整的工具箱,如同 JetBrains Toolbox 那样。但如何开始呢?这个问题困扰了李华很久。直到一天,他在论坛上看到了关于这方面的讨论,并深受启发。本文将分享给你如何构建自己的工具箱,并深入讨论各种技术选择和实现策略。

    1. 为什么要制作自己的工具箱?

    开发工具箱可以帮助你集中管理你的各种开发工具,并提供统一的界面供你进行操作。无论是版本管理、应用下载还是工具启动,都可以在一个界面中完成。

    2. 选择合适的界面框架

    根据业界的讨论,以下是几种常见的界面框架选择:

    • Qt:JetBrains 的前几个版本可能使用的是 Qt。Qt 提供了丰富的界面组件和功能,是制作工具箱的一个很好的选择。

    • Electron:基于 Node.js 的框架,非常适合制作跨平台的桌面应用。但需要注意的是,Electron 打包的应用体积会比较大。

    • Compose Multiplatform:是 JetBrains Toolbox 目前使用的技术栈,基于 Kotlin。

    • Flutter:开发语言是 Dart,可以制作跨平台应用。与 Electron 相比,Flutter 更轻量。

    3. 版本管理和下载

    简单的版本管理可以直接通过文件名和 semver 版本号进行。例如,你可以部署文件到服务器,然后根据文件名下载指定版本。

    更复杂的版本管理可以考虑使用数据库,如 sqlite3。这样,你可以在 Python 中方便地进行查询操作。而如果需要自己的管理页面,则需要进入后端开发领域。

    4. 模块化设计

    无论你选择哪种界面框架,模块化设计都是非常重要的。你应该确保每个工具或应用都是一个独立的模块,这样可以方便地进行管理和更新。

    5. 结论

    制作自己的开发工具箱需要考虑许多方面,从界面框架的选择到版本管理,再到模块化设计。但只要你有明确的目标和策略,这一切都是可以实现的。希望本文能为你提供一些启示,帮助你成功制作自己的工具箱。

  • JWT 和 HTTPS:安全性是如何保障的?

    在一个明亮的周末上午,小明正在忙碌地为他的新项目编写代码。他需要实现用户认证功能,所以选择了 JWT(JSON Web Tokens)作为认证方案。一切进展顺利,但当他与团队成员讨论项目上线细节时,一个问题出现了:他们的网站没有使用 HTTPS。小王,团队中的安全专家,告诉小明:即使使用了 JWT,如果没有 HTTPS,用户的数据依然可能被窃取。这让小明困惑,他决定深入研究 JWT 和 HTTPS 之间的关系,以确保他的应用足够安全。

    1. JWT 是什么?

    JWT 是一个开放标准(RFC 7519),它定义了在两者之间传递信息的简洁方式,该信息可以验证并被安全地传输。常用于身份验证和信息交换。

    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

    JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

    2. HTTPS 是什么?

    HTTPS 是 HTTP 协议的安全版本。与 HTTP 相比,HTTPS 可以加密传输的数据,防止数据被中间人窃取或篡改。

    3. JWT 是否依赖 HTTPS?

    答案是:不依赖,但建议使用。JWT 本身不包括加密,它只是对信息进行编码,并通过签名来验证信息的完整性。如果 JWT 在没有 HTTPS 的情况下传输,那么它很容易被中间人截取,导致安全问题。

    4. HTTPS 与 JWT 的关系?

    • 通信安全和身份校验:HTTPS 负责加密通信内容,保证信息在传输中不被泄露;而 JWT 负责验证请求方的身份,确保他们有权访问某些资源。

    • 中间人攻击:如果只使用 HTTP,那么 JWT 可能被第三方截取,并用于恶意请求。HTTPS 可以有效防止这种攻击。

    5. 怎么确保 JWT 的安全性?

    1. 使用 HTTPS:确保 JWT 在传输过程中不被窃取。

    2. 设置过期时间:为 JWT 设置一个短的过期时间,即使被窃取,也只能在有限的时间内被利用。

    3. 不存储敏感信息:JWT 是可以被解码的,所以不要在其中存储敏感信息,如密码等。

    结束语

    安全永远是开发中的首要任务。使用 JWT 和 HTTPS 可以为你的应用带来很好的安全保障。但同时,也要关注其他安全策略和手段,确保应用从各个方面都得到了保护。

  • 如何在终端中保持制表符(Tab)原样显示?

    李明是一个资深的Linux用户,他经常在终端中编辑和查看代码。但最近他遇到了一个问题:每当他使用lessvim打开文件时,制表符(Tab)都会被转换为空格。这让他很困惑,因为这种转换影响了他对代码的阅读和编辑。经过一番搜索和尝试,他终于找到了解决方法。在本文中,我们将分享这些方法,帮助你在终端中保持制表符的原样显示。

    一、为什么终端会转换制表符?

    制表符(Tab)在终端和文本编辑器中有特殊的作用。它是一个控制字符,用于控制光标的位置。在终端和大多数文本编辑器中,默认情况下,制表符会被转换为一定数量的空格(通常是8个),以实现对齐的效果。

    但在某些情况下,我们希望终端能够原样显示制表符,而不是转换为空格。例如,当我们在终端中查看或编辑代码时,制表符的原样显示很重要,因为它影响到代码的缩进和格式。

    二、如何在less中保持制表符原样显示?

    对于less命令,我们可以使用-U选项来禁止制表符转换。这个选项会告诉less原样显示所有字符,包括制表符。

    less -U filename.txt

    使用这个选项后,less将不会再将制表符转换为空格。

    三、如何在vim中保持制表符原样显示?

    对于vim,我们可以在其配置文件~/.vimrc中添加以下设置:

    set noexpandtab

    这个设置告诉vim不要将制表符转换为空格。保存配置文件并重新启动vim后,制表符将会原样显示。

    四、其他命令和终端软件的设置

    1. GNOME Terminal:在菜单栏点击“编辑” -> “首选项”,取消勾选“将制表符转换为空格”选项。

    2. 其他终端软件:大多数终端软件都有类似的设置选项,你可以在其设置菜单或文档中查找。

    3. git diff:如果你使用git diff命令并发现制表符被转换为空格,你可以使用--no-pager选项来禁止这种转换。

    git --no-pager diff

    五、总结

    制表符在终端中的显示问题可能会影响到我们的工作效率和代码质量。但通过上述方法,我们可以轻松地解决这个问题,并在终端中保持制表符的原样显示。希望这些方法能帮助到你,让你在终端中的工作更加顺畅。

  • 双11购买指南:如何选购合适的群晖NAS?

    双11正悄悄接近,赵明打算趁这个机会买一个群晖NAS,作为一个摄影爱好者,他想要一个稳定、方便的地方存放他珍贵的照片和视频。在和许多网友交流后,他总结了一些购买经验,决定和大家分享。

    一、为什么选择群晖NAS?

    NAS是网络存储服务器的简称,主要用于存储数据,并允许多个用户通过网络访问这些数据。而群晖NAS因其稳定性和用户友好的界面被广大用户所喜爱。尤其是对于摄影爱好者来说,群晖的照片管理应用得到了大家的一致好评。

    二、选购群晖NAS的几点考虑:

    1. 存储需求

    如果你的主要需求是存储照片和视频,那么双盘位的群晖NAS已经足够了。例如,DS220+或DS216+II都是不错的选择。

    2. 媒体库需求

    如果你打算建立一个电影和音乐的媒体库,但不打算从PT下载,那么DS220+等型号已经能满足需求。

    3. 运行其他应用

    群晖NAS不仅仅是一个存储设备,它还可以运行各种应用。例如,你可以在上面运行Docker,挂一些自己写的小服务。如果有这方面的需求,那么建议选择x86架构的CPU,例如DS923+或DS920+。

    三、新品VS二手

    由于群晖硬件更新周期较长,因此在市场上有大量的二手设备。如果你的预算有限,那么二手的DS220+或DS216+II都是很好的选择。但是,如果你追求性能,并希望设备能用更长时间,那么建议选择新品。

    四、注意事项

    • NAS并不等于备份:虽然NAS可以存储大量数据,但它并不能代替备份。重要的数据还应该备份到其他地方,例如外部硬盘或云存储。

    • 选择合适的硬盘:NAS的性能和所选硬盘有关。建议选择专为NAS设计的硬盘,例如西部数据的Red系列。

    • 注意网络环境:NAS的传输速度和你家的网络环境有关。如果可能的话,建议使用有线连接,并确保路由器支持千兆速率。

    五、结论

    选择合适的群晖NAS并不难,关键是明确自己的需求,并做好预算。无论你是选择新品还是二手,只要是合适的,都是最好的。

  • AList:将你的文件管理提升到一个全新的高度

    有一天,我在寻找一个文件列表程序,希望能轻松地管理我分散在各种存储中的文件。我试过了很多解决方案,但它们都不够理想。有的界面复杂,有的功能有限,有的兼容性差。正当我即将放弃的时候,AList走进了我的生活,它简单、强大、兼容性好。我想,在这里分享一下我的经验,也希望AList能帮助到更多的人。

    为什么选择AList?

    你可能会问,市面上有很多文件列表程序,为什么我要选择AList?下面,我为你列举了AList的一些独特功能:

    1. 简单易用

    AList从设计之初就注重用户体验。无论你是新手还是专家,都可以轻松上手。不需要复杂的设置,一切都是那么简单。

    2. 支持多种存储

    你是否有过这样的经历?文件散落在本地硬盘、云盘、外部存储上,查找一个文件需要花费很长时间。但有了AList,这些都不是问题。AList支持多个存储提供商,包括本地存储、阿里云盘、OneDrive、Google Drive等。

    3. WebDAV存储

    你知道WebDAV吗?它是一个文件访问的标准。有了AList,你可以轻松地使用所有WebDAV存储。

    4. 受保护的路由

    安全是我们最关心的问题之一。AList允许你为特定路径添加密码保护和身份验证,确保你的文件安全。

    5. 文件预览

    有时候,我们不仅仅需要管理文件,还需要预览文件内容。AList支持各种文件的预览,包括视频、音频、文档、PDF、图片等。而且,还支持ipa文件的安装!

    6. 打包下载/批量下载

    AList使用浏览器的stream api支持打包下载,不需要服务器的参与。而且,还支持使用Aria2进行批量下载,甚至支持文件夹!

    7. 更多功能

    AList的功能远不止这些。它还有文本编辑器、README/HTML渲染、文件永久链接、Cloudflare Workers代理等功能。每一个功能都是为了提供更好的用户体验。

    结论

    在数字化的时代,文件管理已经成为我们日常生活中不可或缺的一部分。有了AList,这一切都变得简单和高效。我希望我的分享能帮助到你,也希望你能喜欢AList。