协程

协程又称为线程,

线程是一个python个中另外一中实现多任务返方式,在一个线程中的某个函数可以理解任何地方保存当前函数中的临时变量的信息,然后再到另一个函数中执行协程和线程差异在多个处理器的情况下,从概念上多线程同时运行多个线程:而协同程序是同过协作来完成的在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起

简单实现协程from gevent import monkey#导入补丁模块

monkey.patch_all()#创建补丁

import gevent

 import requestfrom queue 

import Queueimport time

#明确url 

base_url='https://hr.tencent.com/position.php?start=%d'#腾讯

def get_page(q):

whilenot q.empty()#判断对象不为空时

    url = q.get#获取队列中的一个

    response=requests.get(url,headers={'User-Agent':'lalala'})#发送请求        

        print(reponse.url)print(time.ctime())#当前时间

        g_list=[]#列表q= Queue()#队列创建

创建任务

foriinrange(0,3800+1,10):

fullurl = base_url/%#将内容插入链家

q.put(fullurl)

#多少个基层

for iinrange(100); 

 g = genent.spawn(get_page,q)#创建协程

g_list.append(g)#将协程对象添加到列表中

# for i in g_list:#遍历状态

# i.join()#等待当前协程执行完毕,在继续执行

gevent.joinall(g_list)#等待所有协程执行完毕

print(time.ctime())#结束时间

greenlet

为了更好使用协程来完成多任务,python中的greenlet模块对其封装,从而使得切换任务变的更加简单

greenlet是一个python的协程管理、切换模块。通过greenlet,你可以显式地在不同的任务之间切换。

gevent.spawn启动的所有协程,都是运行在同一个线程之中,所以协程不能跨线程同步数据。

gevent.queue.Queue 是协程安全的。

python程序实现的一种单线程下的多任务执行调度器,简单来说在一个线程里,先后执行AB两个任务,但是当A遇到耗时操作(网络等待、文件读写等),这个时候gevent会让A继续执行,但是同时也会开始执行B任务,如果B在遇到耗时操作同时A又执行完了耗时操作,gevent又继续执行A。

imort   gevent  

def   test(time)

print(1)

gevent.sleep(time)

print(2)

def  test(time):

print( )

gevent.sleep(time)

print(4)

if__name =='main'

gevent.joinall9[ 

             gevent.spawn(test,2), 

             gevent.spawn(test,3)

])

其中gevent.sleep()是gevent自带的延时,当gevent遇到这个延时时会自动切换,这里用gevent.sleep()代替一些耗时操作

你可能感兴趣的:(协程)