协程:又叫微线程
python的多线程没法利用多核,只能用一个核去切换,没办法实现真正的并行效果。多线程的意义,对于IO密集型是有意义的。大部分处理都是IO的,多线程是可以解决大多数情况的。但是解决不了并行的多进程。
协程:非抢占式的程序,线程和进程都是抢占式的。协程也是要切换的,不过这种切换是我们来规定的,在于我们的需求。
用户态的切换。
协程主要解决的问题也是IO操作,比多线程效果好得多。计算密集型的,协程的效果也不是很好。
优点:没有切换,没有锁一说,因为协程的本质就是一个线程
缺点:不能用多核,还得靠多进程+协程模式才能解决并发问题
import requests,time,gevent
starttime=time.time()
def f(url):
print('get the url:',url)
res=requests.get(url)
data=res.text
print('%s bytes' % len(data))
with open('new','w',encoding='utf8') as t:
t.write(data)
# f('http://www.sina.cn')
# f('http://sina.com.cn')
# f('http://smzdm.com')
# f('https://blog.csdn.net/dengyuelin/article/details/54628774')
gevent.joinall([
gevent.spawn(f,'http://baidu.com'),
gevent.spawn(f,'http://sina.com.cn'),
gevent.spawn(f,'http://smzdm.com'),
gevent.spawn(f,'https://blog.csdn.net/dengyuelin/article/details/54628774')
])
print('cost time',time.time()-starttime)