首页 > 系统相关 >macos使用包含urllib.request的多进程问题

macos使用包含urllib.request的多进程问题

时间:2024-03-08 12:33:53浏览次数:15  
标签:fork macos 调用 request urllib API 进程

urllib.request 模块的官方文档

在 macOS 上使用 urllib.request 模块与 os.fork() 的问题主要与多进程编程和系统 API 的交互有关。具体来说,urllib.request 模块在获取代理设置时会调用 macOS 的系统级函数来获取这些信息,而这些函数可能并不是“fork-safe”的。

当你在 Python 中使用 os.fork() 创建一个新的子进程时,子进程会继承父进程的内存空间和文件描述符。在 fork() 调用之后,父子进程中的内存是分离的,但是在 fork() 调用之前已经打开的资源(例如文件描述符和锁)会在父子进程间共享。

某些系统级别的 API,包括 macOS 的 getproxies() 函数,可能在内部使用了不适用于多进程场景的资源,比如全局锁或者背景线程。如果你在父进程中调用了这些 API,然后进行了 fork(),子进程可能会试图使用已经由父进程独占或改变状态的资源,这可能导致竞态条件、死锁或其他不可预测的行为。

Apple 的文档明确指出了一些不应该在多线程或多进程环境中使用的 API。此外,POSIX 标准也指出 fork() 后唯一安全调用的函数是 exec() 系列函数,因为许多库和系统调用在 fork() 后可能不安全。

为了避免这种类型的问题,你应该尽量避免在多进程应用程序中使用可能不是 fork-safe 的系统 API,或者在 fork() 之后不要调用任何可能会与父进程中打开的资源发生冲突的代码。

如果你在多进程程序中确实需要使用 urllib.request,有以下几种方法可以减少问题发生的可能性:

  1. 在 fork() 之前初始化任何可能会调用系统 API 的库或模块;
  2. 使用 multiprocessing 模块代替 os.fork(),因为它提供了更高层次的抽象,并且在创建新进程时会更加小心地管理资源;
  3. 如果你的程序结构允许,尽量避免在多进程中进行网络请求,或者在 fork() 之前完成所有网络请求。

参考:
https://docs.python.org/zh-cn/3/library/urllib.request.html
https://bugs.python.org/issue30385

标签:fork,macos,调用,request,urllib,API,进程
From: https://www.cnblogs.com/xxxxxxxxjh/p/18060729

相关文章

  • macOS的任务计划crontab
    使用crontab执行计划任务看了看多老大的讲解和视频仍然无法正常运行,在这里整理了一下crontab的用法和坑首先crontab是需要预先创建。第一步打开终端,执行sudotouch/etc/crontab如果不创建我们所编辑的crontab命令会保存到/tmp目录中,不知道什么时候就会消失,很多人问题出在这......
  • macOS m1芯片报错 java.lang.UnsatisfiedLinkError: no taos in java.library.path
    项目中有用到TDengine,MacOSm1芯片本地开发启动项目报错如下java.lang.UnsatisfiedLinkError:notaosinjava.library.path方案一(推荐)以上错误是因为java在连接TDengine数据库的时候没有找到本地函数库。本地安装一下TDengine,然后在/usr/local/lib/下就会有taos函数库。因此......
  • npm报错:request to https://registry.npm.taobao.org failed, reason certificate ha
    NPM使用遇到错误:错误原因:淘宝镜像过期解决方案:​ 1.查看当前npm设置:npmconfiglist​ 2.清空缓存:npmcacheclean--force​ 3.修改npm为淘宝镜像:npmconfigsetregistryhttps://registry.npmmirror.com​ 4.再次查看npm设置,已经修改为淘宝镜像)​ 问题解决......
  • vscode 的sync的问题RequestFailed (UserDataSyncError) syncResource:unknown operat
    024-03-0708:58:24.361[error]RequestFailed(UserDataSyncError)syncResource:unknownoperationId:unknown:Connectionrefusedfortherequest'https://vscode-sync.trafficmanager.net/v1/manifest'.atu.D(c:\Debug\VSCode\resources\app\ou......
  • drf源码剖析----request
    点击查看代码源码解析:#请求函数内的request,*args,**kwargs传给父类APIView内的dispatch()函数defdispatch(self,request,*args,**kwargs):self.args=argsself.kwargs=kwargs#request,*args,**kwargs传给self.initialize_request(request,......
  • 为HTTP而生的requests库,纵横江湖难逢敌手
    既然Python是一门全球流行的语言,那么对于网络通信的HTTP的支持肯定也是非常的优秀的。Python中原生的urllib模块也有对HTTP的支持,虽然也可以用来发送HTTP请求,但使用起来相对繁琐,并且API设计不够直观。requests库的出现填补了Python在HTTP请求方面的不足,简化了开发者的工......
  • python-Grequests,一个好用的 requests库的异步版本!
    Grequests是什么?grequests是一个Python库,它是requests库的异步版本。它允许你同时发送多个HTTP请求,而不必等待每个请求依次响应。可以在等待服务器响应的同时执行其他任务,从而节省时间并提高效率。安装Grequestspipinstallgrequests使用示例一:批量获取网页假如有一个......
  • 在PowerShell中下载文件是一项常见的任务,可以通过多种方法完成。下面我将介绍使用Invo
    在PowerShell中下载文件是一项常见的任务,可以通过多种方法完成。下面我将介绍使用Invoke-WebRequest、New-Object和Start-BitsTransfer命令来下载文件的方法。使用Invoke-WebRequestInvoke-WebRequest是一个非常强大的命令,用于向网页发送HTTP和HTTPS请求。你可以使用它来下载文......
  • macOS14使用brew下载Redis时出现的问题和解决方法
    当我使用brew下载redis时系统:macOS14(base)hanxuxian@hanxuxiandeMacBook-Air~%brewinstallredis报错信息:Error:git:unknownorunsupportedmacOSversion::dunnoError:'git'mustbeinstalledandinyourPATH!Warning:YouareusingmacOS14.Wedon......
  • 【python接口自动化系列】python + pytest + requests + allure + jsonpath + pyyaml,
     前置基础:python虚拟环境的创建、操作、迁移等python操作yamlpython操作mysqlpytest简易教程 配套练习环境(含相关接口):https://www.cnblogs.com/uncleyong/p/17165143.html 如果文章不能访问,请联系处理,wx:ren168632201 python接口自动化系列(01):自动化测试框......