python 多线程处理数据_Python多线程与多处理

Python多线程与多处理

Python中有一个称为线程的库 ,它使用线程(而不只是进程)来实现并行性。如果您了解Python的Global Interpreter Lock或GIL,这可能是令人惊讶的消息 ,但是它实际上在某些情况下可以很好地工作而不会违反GIL。这一切都没有任何开销-只需定义发出I / O请求的功能,系统即可处理其余的功能。

全局翻译锁

全局解释器锁通过一次只允许一个本机线程执行,从而降低了Python(更确切地说是CPython)中线程的有用性 。这使得在(通常是线程不安全的)C库中实现Python更加容易实现,并且可以提高单线程程序的执行速度。但是,它仍然存在争议,因为它阻止了真正的轻量级并行性。您可以实现并行性,但是它需要使用多重处理,这由同名的库 multiprocessing实现。该库不使用线程,而是使用绕过GIL的进程。

看起来,GIL会杀死Python多线程,但效果不佳。通常,多线程有两个主要用例:

在单台计算机上利用多个内核

利用I / O延迟来处理其他线程

通常,我们不能从(1)的线程中受益,但可以从(2)的中受益。

多处理

通用 threading 库是相当低级的,但事实证明它是将其 multiprocessing 包装起来的 multiprocessing.pool.ThreadPool,它方便地采用与相同的接口 multiprocessing.pool.Pool。

使用的好处之一 threading 是可以避免酸洗。多处理依赖于内存中的酸洗对象将其发送到其他进程。例如,如果 timed 装饰没有 wraps 了 wrapper 它返回的函数,那么CPython中就能够咸菜我们的功能 request_func ,并 selenium_func 因此这些不能多处理。相比之下,该 threading 库即使通过 multiprocessing.pool.ThreadPool 工作也很好。多处理还需要更多的内存和启动开销。

分析

我们分析了高度依赖I / O的任务,即对随机的维基百科页面发出100个URL请求。我们比较一下:

Python 请求 模块和

带有 PhantomJS的Python 硒。

我们以三种方式运行这些请求,并测量每次获取所需的时间:

串联

在threading 具有10个线程的池中并行

在multiprocessing 具有10个线程的池中并行

每个请求都是定时的,我们比较结果。

结果

首先,for的每线程运行时间 requests 明显少于for  selenium,因为后者需要启动一个新进程来运行 PhantomJS 无头浏览器。还有趣的是,各个线程(尤其是硒线程)的串行运行速度比并行运行速度快,这是典型的带宽与延迟之间的权衡。

尤其是,硒线程的速度要慢两倍以上,这很可能是由于10个硒工艺一次旋转导致的资源争夺。

同样, 与串行相比,多线程时所有线程的selenium 请求运行速度大约快4倍,请求运行速度 大约快8倍 requests。

结论

使用threading 和 之间没有明显的性能差异 multiprocessing。多线程和多处理之间的性能极为相似,确切的性能细节可能取决于您的特定应用程序。穿线 multiprocessing.pool.ThreadPool 真的很容易,或者至少和使用multiprocessing.pool.Pool 界面一样容易 -只需将I / O工作负载定义为一个函数,然后使用 ThreadPool 即可并行运行它们。

1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值