多进程

python高级爬虫笔记(2)

坚强是说给别人听的谎言 提交于 2020-02-05 21:09:16
提高爬虫效率主要从三个方面开始复习。 并发 ip cookies 并发必然引发的一个结果就是反爬虫机制,这种时候爬虫的效率不会因为并发而提高,反而会因为网站的防御机制拖累爬虫的速度。 自然而然地就引出了2,代理爬虫。代理爬虫能够从多个ip发送请求,减小了单个ip的请求频率,自然触发反爬虫机制的概率也就小了很多。 但是新的问题又出现了,对于需要 登录 的网站,需要提交cookies来模拟登录情况,模拟登录不难,但是同一个cookies从不同的ip同时发送请求很明显不合常理,依然会触发反爬虫机制。 这是到目前为止我所遇到的影响爬虫效率的问题,就在这里做一个总结吧,如果后续遇到新的效率相关的问题,再做补充。 并发 前言 在2019年,我阅读了python cookbook,其中对这一方面有较为详细且透彻的讲述,比较适合有python基础的人学习。 多进程、多线程是python程序员的必修课之一。因为,即使脱离了爬虫,机器学习、web开发等方面,多线程、多进程依旧有着举足轻重的地位。 这是开发者的一个小分水岭,它在一定程度上决定了程序效率的高低。 python中的多进程方法 多线程、多进程、协程爬虫 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程

python多进程编程

一世执手 提交于 2020-02-01 22:10:11
程序和进程 一个程序一般由代码和运行时的资源所组成,系统为每个程序分配一个或者多个编号,在程序中 运行的这些模块(逻辑模块)共同实现程序的设计目标,这些同时运行的模块中的每个成员都可以看作一个进程, 每个进程拥有独立的内存空间 。 命令行下,查看进程id和父进程id >>> import os >>> os.getpid() #当前进程id 10252 >>> os.getppid() # #父进程id 5884 多进程 python中的多进程模块multiprocessing, 常用类、方法和属性:Pool,Process,Queue 需要注意: 全局变量不能被多进程共享 。 可以通过 队列 multiprocessing.Queue向多进程传递数据,但是不能使用常规队列queue.Queue。 q = multiprocessing.Queue(3) # 设置队列可以容纳数据的最大数量 队列q的常用方法和属性:put、put_nowait、get、get_nowait、empty、full、qsize等。 通常,使用windows系统(不支持fork函数)进行多进程模块的某些类和方法编程时,需要把多进程代码写到if语句之下,否则报错。 def demo1(): pass def demo2(): pass if __name__ == '__main__': t1 =

Python并发与并行的新手指南

陌路散爱 提交于 2020-02-01 09:18:05
点这里 在批评Python的讨论中,常常说起Python多线程是多么的难用。还有人对 global interpreter lock(也被亲切的称为“GIL”)指指点点,说它阻碍了Python的多线程程序同时运行。因此,如果你是从其他语言(比如C++或Java)转过来的话,Python线程模块并不会像你想象的那样去运行。必须要说明的是,我们还是可以用Python写出能并发或并行的代码,并且能带来性能的显著提升,只要你能顾及到一些事情。如果你还没看过的话,我建议你看看Eqbal Quran的文章《 Ruby中的并发和并行 》。 在本文中,我们将会写一个小的Python脚本,用于下载Imgur上最热门的图片。我们将会从一个按顺序下载图片的版本开始做起,即一个一个地下载。在那之前,你得注册一个 Imgur上的应用 。如果你还没有Imgur账户,请先注册一个。 本文中的脚本在Python3.4.2中测试通过。稍微改一下,应该也能在Python2中运行——urllib是两个版本中区别最大的部分。 开始动手 让我们从创建一个叫“download.py”的Python模块开始。这个文件包含了获取图片列表以及下载这些图片所需的所有函数。我们将这些功能分成三个单独的函数: get_links download_link setup_download_dir 第三个函数,“setup_download

python 高性能编程之协程

独自空忆成欢 提交于 2020-01-27 08:24:38
用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣。为了异步,我们曾使用多线程编程。然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程编程的高出错风险,“协程 + 多进程”的组合渐渐被认为是未来发展的方向。技术容易更新,思维转变却需要一个过渡。我之前在异步事件处理方面已经习惯了回调 + 多线程的思维方式,转换到协程还非常的不适应。这几天我非常艰难地查阅了一些资料并思考,得出了一个可能并不可靠的总结。尽管这个总结的可靠性很值得怀疑,但是我还是决定记录下来,因为我觉得既然是学习者,就不应该怕无知。如果读者发现我的看法有偏差并指出来,我将非常感激。 多线程下异步编程的方式 线程的出现,为开发者带来了除多进程之外另一种实现并发的方式。比起多进程,多线程有另一些优势,比如可以访问进程内的变量,也就是共享资源。还有的说法说线程创建比进程创建开销低,考虑到这个问题在 Windows 一类进程创建机制很蹩脚的系统才存在,故先忽略。总的来说,线程除了可以实现进程实现的“并发执行”之外,还有另一个功能,就是管理应用程序内部的“事件”。我不知道把这种事件处理分类到异步中是不是合适,但事件处理一定是基于共享进程内资源才能实现的,所以这是多线程可以做到而多进程做不到的一点。 异步处理基于两个前提。第一个前提是支持并发

进程 线程

筅森魡賤 提交于 2020-01-27 05:25:26
一.关于线程和进程的说明   python本身没有进程和线程,python中调用了操作系统的线程和进程.   一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认一个).      创建进程是为了提供环境让线程工作,进程和进程之间做数据隔离(java/c#)   创建线程是因为线程是cpu工作的最小单元,创建线程可以利用多核优势实现并行操作(java/c#)   而python中存在一个GIL锁造成多线程无法利用多核优势,只能开多进程处理(浪费资源)   查看GIL切换的指令(sys.getcheckinterval)   Python语言的创始人在开发这门语言时,目的是快速把语言开发出来,如果加上GIL锁(C语言加锁),切换时按照100条字节指令来进行线程间的切换。    二. python进程,线程和java,c#的区别   python多线程情况下:        计算密集型操作:效率低(GIL锁)        IO操作:效率高   python多进程的情况下:        计算密集型操作:效率高(浪费资源)不得已而为之.        IO操作:效率高(浪费资源)   写python时IO密集型用多线程,计算密集型用多进程      java,c#多线程情况下:        计算密集型操作:效率高        IO操作:效率高  

并发、并行与C++多线程——基础一

拈花ヽ惹草 提交于 2020-01-26 17:45:50
1、什么是并发? 并发指的是两个或多个独立的活动在同一时段内发生。生活中并发的例子并不少,例如在跑步的时候你可能同时在听音乐;在看电脑显示器的同时你的手指在敲击键盘。这时我们称我们大脑并发地处理这些事件,只不过我们大脑的处理是有次重点的:有时候你会更关注你呼吸的频率,而有时候你更多地被美妙的音乐旋律所吸引。这时我们可以说大脑是一种并发设计的结构。这种次重点在计算机程序设计中,体现为某一个时刻只能处理一个操作。 2、什么是并行? 与并发相近的另一个概念是 并行 。它们两者存在很大的差别。并行就是 同时执行 ,计算机在 同一时刻 ,在某个时间点上处理两个或以上的操作。判断一个程序是否并行执行,只需要看某个时刻上是否多两个或以上的工作单位在运行。一个程序如果是单线程的,那么它无法并行地运行。利用多线程与多进程可以使得计算机并行地处理程序(当然 ,前提是该计算机有多个处理核心)。 3、并发与并行的显著区别: 并发:同一时间段内可以交替处理多个操作。 并行:同一时刻内同时处理多个操作。 并发的程序设计,提供了一种方式让我们能够设计出一种方案将问题(非必须地)并行地解决。如果我们将程序的结构设计为可以并发执行的,那么在支持并行的机器上,我们可以将程序并行地执行。因此,并发重点指的是程序的设计结构,而并行指的是程序运行的状态。并发编程,是一种将一个程序分解成小片段独立执行的程序设计方法。 . 4

进程和线程相关

…衆ロ難τιáo~ 提交于 2020-01-26 10:24:47
一、操作系统/应用程序 1、硬件 硬件包括硬盘、cpu、主板、显卡、内存、电源........ 2、系统 系统就是由程序员写出来的软件,该软件用于控制计算机的硬件,让他们相互配合工作 3、安装软件(安装应用程序) 二、线程和进程 应用程序调用操作系统的线程和进程 单进程、多线程的应用程序 1 import threading 2 print('666') 3 4 def func(arg): 5 print(arg) 6 t = threading.Thread(target=func) #创建线程 7 t.start() 8 9 print('end') #主线程 一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认只有一个) 操作系统帮助开发者操作硬件 python在多线程和多进程的情况 1、多线程情况下   计算机密集型操作:效率低。(GIL锁)   IO操作:效率高 2、多进程的情况下   计算机密集型:效率高(浪费资源,不得已而为之)   IO操作:效率高 对于python进程和线程的选择:   计算机密集型:多进程   IO操作:多线程 3、GIL锁:是全局解释器锁。用于限制一个进程中同一个时刻只有一个线程被CPU处理     扩展:默认GIL锁在执行100个CPU指令(过期时间) 1 import sys 2 v1=sys

python中的多线程、多进程

旧巷老猫 提交于 2020-01-26 01:38:40
https://www.cnblogs.com/zingp/p/5878330.html 阅读目录 1 线程与进程 2 Python GIL(Global Interpreter Lock) 3 threading模块 GIL VS Lock RLock(递归锁) Semaphore(信号量) 4 多进程 回到顶部 1 线程与进程 1.1什么是线程?   线程是操作系统能够进行运算调度的最小单位(程序执行流的最小单元)。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。   一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程

python中多线程与多进程的区别和联系

纵然是瞬间 提交于 2020-01-25 15:56:41
python多线程实现 python多线程和多进程的区别 python多线程爬虫 python多线程坑 python多线程可以在windows下实现吗 python多线程并发 python多线程变量共享 python多线程是并发还是并行 python多线程实例 python多线程condition Python中多进程与多线程的区别有:线程需要在进程中执行,一个进程可包含多个线程;进程可共享同个地址空间而进程共享物理地址,线程创建简单,进程需要对父进程克隆等等 今天将要分享的是Python中多进程与多线程的相关知识及区别,接下来将在文章中具体介绍,具有一定的参考价值,希望对大家有所帮助 更多的详细内容学习点我 【推荐课程: Python教程 】 线程的概念: 线程是操作系统中进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程可以有多个线程,每条线程可以同时执行不同的任务。一个线程可以看作一个cpu执行时所需要的一串指令 多线程 在Python的标准库中提供了两个模块:_thread和threading,_thread是低级模块不支持守护线程,当主线程退出时,所有子线程都会被强行退出。而threading是高级模块,用于对_thread进行了封装支持守护线程

Python标准库10 多进程初步(multiprocessing包)【高薪必学】

烂漫一生 提交于 2020-01-22 21:24:34
我们已经见过了 使用subprocess包来创建子进程 ,但这个包有两个很大的局限性:1) 我们总是让subprocess运行外部的程序,而不是运行一个Python脚本内部编写的函数。2) 进程间只通过管道进行文本交流。以上限制了我们将subprocess包应用到更广泛的多进程任务。(这样的比较实际是不公平的,因为subprocessing本身就是设计成为一个shell,而不是一个多进程管理包) threading和multiprocessing (请尽量先阅读 Python多线程与同步 ) multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。另外很多人在学习Python的过程中