首页 > 编程知识 正文

python爬虫多线程(python线程并发)

时间:2023-05-05 11:07:49 阅读:102354 作者:761

一、多线程多进程

在开始之前,让我们介绍一下什么是流程。进程实际上代表了计算机正在执行的任务。比如打开浏览器就是启动浏览器进程,打开记事本就是启动记事本进程。

但是,一个流程可能不仅仅能做一件事,就像Word流程一样,在打字的同时,还会有拼写检查。这些在流程中同时执行的“子任务”称为线程。

进程和线程的主要区别在于它们是操作系统资源管理的不同方式。进程有独立的地址空间。当一个进程崩溃时,它不会影响处于保护模式的其他进程,而线程只是一个进程中不同的执行路径。线程有自己的栈和局部变量,但线程之间没有单独的地址空间,一个线程的死亡意味着整个进程的死亡,所以多进程程序比多线程程序更健壮,但在进程切换时,消耗的资源更多,效率更低。但是,对于一些需要同时操作并共享某些变量的并发操作,只能使用线程,不能使用进程。

过去的单核CPU,系统是通过在多个进程之间不断切换——来执行多进程的,比如任务1 0.01秒,任务2 0.01秒,然后任务3.等等。然而多核CPU出现后,真正的多任务并行执行才能真正实现。但围绕这一点,一台计算机可以同时执行的进程太多了,远远大于CPU内核的数量。因此,手术

多线程执行类似于多进程,通过快速切换也达到了看似“同时运行”的目的。

如果我们想同时执行多个任务,我们有以下三个选项:

编写多个程序,然后同时运行它们。在一个程序中运行多个线程、多个进程和多个线程。2.Python多进程编程

多进程:

多进程的实现与你的操作系统有关。例如,Unix/Linux操作系统提供了一个fork()系统调用来创建进程。普通函数调用,调用一次返回一次,但是fork()调用一次返回两次,因为操作系统会自动复制当前进程的一个副本(称为父进程)(称为子进程),然后分别在父进程和子进程中返回。

但是Window系统中没有这样的系统调用,所以没有办法用fork()实现多进程。Python为跨平台版本的Python提供了一个多处理模块来使用多处理。这个模块提供一个过程类来表示一个过程对象。

进程池:

如果要创建大量的子流程,可以通过流程池的方式批量创建子流程。

进程池类池也由模块多进程导出。

对于Pool对象,如果要调用join(),则必须提前调用close()。一旦调用close(),就不能添加新的子进程。(如果不调用close(),它会认为你不能加入(),因为你必须添加子进程。)

三.进程间通信

Python多进程模块为进程间通信提供了Queue和Pipe类,还有很多其他方法。这里先介绍这两种方法。

Queue是一个多进程安全队列,可以用来在多个进程之间传输数据。Queue put()方法用于将数据插入队列尾部,get()方法用于从队列头部获取数据。它们都有两个参数:阻塞和超时。当队列已满且阻塞为真时,如果超时为正,它将阻塞超时指定的时间,直到队列中剩余空间。如果超时,将出现一个队列。将引发完全异常。同样,当队列为空且阻塞为真时,如果超时为正,它将等待超时时间,直到数据被插入,然后将其带走。如果在等待时间内没有类型数据插入,队列。将引发空异常。(创建队列对象时,接受maxsize参数来限制队列中的对象数量)。

管道是实现两个进程之间通信的另一种方法。管道对象有两种,一种是单向管道,另一种是双向管道。您可以通过构造方法“管道”(双工=假)创建单向管道(默认情况下为双向管道)。

管道执行任务的方式是,一个进程从管道的一端输入对象,然后一个进程从管道的另一端接收对象。单向管道仅允许来自管道一端的过程输入,而双向管道允许来自两端的输入。

调用构造函数Pipe()会创建一个双向管道,这实际上会创建一个由两个单向管道组成的二进制组。如果一个进程调用单向管道的发送方法,另一个进程就不能再调用该管道的发送方法。从示例中我们可以看到,流程发送方使用二进制组的第一个管道的发送,流程接收方使用第二个管道。

四.摘要

掌握Python多进程编程技术,可以充分利用多核CPU,大大提高计算机的执行效率。比如在生成随机森林时,使用多进程可以提高CART的生成率等等。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。