gevent

python3.7导入gevent模块报错的解决方案

不问归期 提交于 2020-03-04 09:10:12
最近更新了python解释器3.7 结果安装gevent,在导入gevent之后就报错了,错误信息如下 RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility. Expected 144, got 128 return f(*args, **kwds) 看到现在写这个问题的帖子不多,就先贴出来了。 只需要执行一下下面这段代码就可以了 pip3 install -U --force-reinstall --no-binary :all: gevent 附上参数说明 -U, --upgrade Upgrade all specified packages to the newest available version. The handling of dependencies depends on the upgrade-strategy used. --force-reinstall Reinstall all packages even if they are already up-to-date. --no-binary <format_control> Do not use binary packages. Can be supplied multiple times

Python学习第九天

拟墨画扇 提交于 2020-03-03 08:29:20
生产者-消费者模型: 看下面的例子哦: 1 import threading,queue 2 import time 3 def consumer(n): 4 while True: 5 print("\033[32;1mconsumer [%s]\033[0m get task: %s"%(n,q.get())) 6 time.sleep(1) 7 q.task_done() 8 def producer(n): 9 count=1 10 while True: 11 print('producer [%s] produced a new task: %s'%(n,count)) 12 q.put(count) 13 count += 1 14 q.join()#queue is emtpy 15 print('all tasks has been cosumed by consumers...') 16 q=queue.Queue() 17 c1=threading.Thread(target=consumer,args=[1,]) 18 c2=threading.Thread(target=consumer,args=[2,]) 19 c3=threading.Thread(target=consumer,args=[3,]) 20 21 p=threading.Thread

Python_协程

邮差的信 提交于 2020-03-02 22:26:31
引子   之前我们学习了线程、进程的概念,了解了在操作系统中 进程是资源分配的最小单位,线程是CPU调度的最小单位。 按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。   随着我们对于效率的追求不断提高, 基于单线程来实现并发 又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。   为此我们需要先回顾下并发的本质:切换+保存状态   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长       ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态    一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。   为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级

Python - 协程

本小妞迷上赌 提交于 2020-03-02 12:07:50
一、简介 协程是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是协程: 协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。 需要强调的是: # 1.python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cup执行权限,切换其它线程运行) # 2.单线程内开户协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(非io操作的切换与效率无关) 对比操作系统控制线程的切换,用户在单线程内控制协程的切换 优点如下: # 1.协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级 # 2.单线程内就可以实现并发的效果,最大限度地利用cpu 缺点如下: # 1.协程的本质是单线程,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程 # 2.协程指的是单线程,因而一旦协程出现阻塞,将会阻塞整个线程 总结协程特点: 1. 必须在只有一个单线程里实现并发 2. 修改共享数据不需要加锁 3. 用户程序里自己保存多个控制流的上下文栈 附加:一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield,greenlet都无法实现,就用到了gevent模块(select机制)) 二、Greenlet 如果我们在单个线程内有20个任务

协程

筅森魡賤 提交于 2020-03-01 10:59:07
协程的初识 协程本质上就是一个线程 一个线程实现并发.如果协程中处理的所有任务都遇到了阻塞 协程就会停止 只有阻塞完成会切回来 进程间是由操作系统调控cpu 而协程是由我们自己书写的程序调控的 单个cpu : 10个任务,让你给我并发的执行这个10个任务: 方式一:开启多进程并发执行, 操作系统切换+保持状态. 方式二:开启多线程并发执行,操作系统切换+保持状态. 方式三:开启协程并发的执行, 自己的程序 把控着cpu 在3个任务之间来回切换+保持状态. 协程他切换速度非常快,蒙蔽操作系统的眼睛,让操作系统认为cpu一直在运行你这一个线程(协程.) 单核心下处理多任务最好的方式 协程 开销小. 运行速度快. 协程会长期霸占cpu只执行我程序里面的所有任务. 并发的本质:就是切换+保持状态. 协程处理IO密集型, 计算密集型,还是串行好. 什么是协程? 单个线程并发的处理多个任务. 程序控制协程的切换+保持状态. 协程的特点: 必须在只有一个单线程里实现并发 修改共享数据不需加锁 用户程序里自己保存多个控制流的上下文栈(保持状态) 附加:一个协程遇到IO操作自动切换到其它协程 工作中: ​ 一般在工作中我们都是进程+线程+协程的方式来实现并发,以达到最好的并发效果,如果是4核的cpu,一般起5个进程,每个进程中20个线程(5倍cpu数量),每个线程可以起500个协程

Install gevent in AIX with gcc

对着背影说爱祢 提交于 2020-02-29 20:48:24
greenlet Download greenlet-0.4.1.zip from https://github.com/python-greenlet/greenlet sudo gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -fno-tree-dominator-opts -I. -I/opt/freeware/include/python2.7 -c greenlet.c -o build/greenlet.o sudo gcc -shared -lpthreads -lpython2.7 -o build/greenlet.so build/greenlet.o sudo cp build/greenlet.so /opt/freeware/lib/python2.7/site-packages/ libev Download libev-4.15.tar.gz from http://dist.schmorp.de/libev/ ./configure --prefix=/usr/local/libev gmake && sudo gmake install c-ares Download c-ares from http://c-ares

python中的进程、线程(threading、multiprocessing、Queue、subprocess)

末鹿安然 提交于 2020-02-28 01:12:36
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然。你做到了你就比别人NB。 我们先了解一下什么是进程和线程。 进程与线程的历史 我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块。 进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 在早期的操作系统里,计算机只有一个核心,进程执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。 随着计算机技术的发展,进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机

python多协程爬虫示例

谁说我不能喝 提交于 2020-02-26 05:24:50
写python协程时使用gevent模块和queue模块可以大大提高爬虫速度。在同时爬取多个网站时,原来用for循环一个网站一个网站按循序顺序爬,就像先烧饭后烧菜,两个步骤异步进行。使用多协程可以让爬虫自己选择爬取顺序,就像边烧饭边烧菜,两个步骤同步进行,速度自然快了。 不多说了,来看下代码吧: from gevent import monkey monkey.patch_all() #打上多协程布丁,下面的程序就可以执行多协程了 import requests,gevent,csv from gevent.queue import Queue from bs4 import BeautifulSoup #把所有URL都放到一个列表里: url_list=[] i=1 for i in range(10): i=i+1 url='http://www.mtime.com/top/tv/top100/index-'+str(i)+'.html' url_list.append(url) #第一个url和别的不一样,需要单独加入 url_0='http://www.mtime.com/top/tv/top100/' url_list.append(url_0) headers={ 'User-Agent': } csv_file=open('时光网电影列表.csv','a+'

爬虫性能相关

橙三吉。 提交于 2020-02-24 13:32:18
爬虫信息相关 这里我们通过请求网页例子来一步步理解爬虫性能 当我们有一个列表存放了一些url需要我们获取相关数据,我们首先想到的是循环 简单的循环串行 这一种方法相对来说是最慢的,因为一个一个循环,耗时是最长的,是所有的时间总和 代码如下: import requests url_list = [ 'http://www.baidu.com', 'http://www.pythonsite.com', 'http://www.cnblogs.com/' ] for url in url_list: result = requests.get(url) print(result.text) 通过线程池 通过线程池的方式访问,这样整体的耗时是所有连接里耗时最久的那个,相对循环来说快了很多 import requests from concurrent.futures import ThreadPoolExecutor def fetch_request(url): result = requests.get(url) print(result.text) url_list = [ 'http://www.baidu.com', 'http://www.bing.com', 'http://www.cnblogs.com/' ] pool = ThreadPoolExecutor(10)

协程笔记说明

徘徊边缘 提交于 2020-02-22 16:29:47
协程笔记说明 协程的定义 通过使用yield完成多任务 greenlet进行封装来替换生成器 gevent实现多任务 不依赖gevent的自带延时和阻塞切换 协程和线程差异 进程、线程和协程对比 协程的定义 协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。 通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。 通过使用yield完成多任务 import time def task_1(): while True: print("---1----") time.sleep(0.1) yield def task_2(): while True: print("---2----") time.sleep(0.1) yield def main(): t1 = task_1() t2 = task_2() # 先让t1运行一会,当t1中遇到yield的时候,再返回到t2,然后 # 执行t2