最原始的请求
url_list=[
'https://www.cnblogs.com/yunxintryyoubest/category/1338759.html',
'https://www.cnblogs.com/',
'http://www.baidu.com'
]
# import requests
# for url in url_list:
# response=requests.get(url)
# print(response)
#
#
多线程
#
# from threading import Thread
# import threading
# import requests
# def get_url_response():
# for url in url_list:
# print('执行url',url,threading.current_thread().name)##拿到当前的线程的名字
# response=requests.get(url)
# print(response)
# a=Thread(target=get_url_response,name='线程')
# a.run()
#

协程:

'''协程'''
from gevent import monkey;monkey.patch_all()
import gevent
import requests
import threading all_urls=[
'https://www.cnblogs.com/yunxintryyoubest/category/1338759.html',
'https://www.cnblogs.com/',
'http://www.baidu.com'
]
def f(url):
import time
before_time=time.time()
# print(before_time)
response=requests.get(url)
print(response)
after_time=time.time()
# print(after_time)
delay=after_time-before_time
print('延迟时间',delay)
gevent_list=[]
for i in all_urls:
gevent_list.append(gevent.spawn(f,i))
gevent.joinall(gevent_list) #协程,里面只要放入列表就可以了,单线程
# gevent.joinall([
# gevent.spawn(f,'https://www.cnblogs.com/'),
# gevent.spawn(f, 'https://www.baidu.com'),
# gevent.spawn(f, 'https://www.cnblogs.com/yunxintryyoubest/category/1338759.html'),
# ])
'''
gevent内部调用了greenlet,实现了协程,本质上自己不可以完成
协程+IO切换
''' 带参数的协程:
import  gevent
from gevent import monkey
monkey.patch_all()#############注意一下,这个原来的socket是来一个发一个,而这个是封装成异步的socket,可以多个,不加效果是没有的
#########第二个gevent是协程的模块
import requests def task(method,url,req_kwargs):
print(method,url,req_kwargs)
response=requests.request(method=method,url=url,**req_kwargs)
print(response.url,response.content) from gevent.pool import Pool
########################这里面是可以控制这个发送的数量的,最多可以发多少个协程请求
# pool=Pool(None)
pool=Pool(5)
gevent.joinall([
gevent.spawn(task, method='get', url='http://www.baidu.com', req_kwargs={}),
gevent.spawn(task, method='get', url='http://www.taobao.com', req_kwargs={}),
gevent.spawn(task, method='get', url='http://www.taobao.com', req_kwargs={}),
])

基于事件循环的异步非阻塞:(外部调用)
'''异步'''
###基于事件循环的异步非阻塞
from twisted.web.client import getPage,defer
from twisted.internet import reactor
url_list=[
'https://www.cnblogs.com/yunxintryyoubest/category/1338759.html',
'https://www.cnblogs.com/',
'http://www.baidu.com'
]
defer_list=[]
def call_back(content):
print(content)
for url in url_list:
defered=getPage(bytes(url,encoding='utf-8'))
defered.addCallback(call_back)
defer_list.append(defered)
##把全部的defer加进来列表里面
def defer_stop():
reactor.stop()
defered=defer.DeferredList(defer_list)
defered.addBoth(defer_stop)
reactor.run()
greenlet,实现内部切换的作用,当遇到io操作的时候(内容调用)
'''一个协程内部被switvch切换走了'''

'''讲解一下原理:这里面不同的切换,在单线程下面不停的切换
内部调配,事件循环是外部调配'''
from greenlet import greenlet def fun1():
print(1)
test2.switch()
print(3)
test2.switch()
##自己内部做切换,遇到io请求,就执行切换
print(5)
'''携程内部就会进行切换,遇到io请求,就会内部实现切换,自己调用switch
而事件循环是基于外部来调配的'''
#
def fun2():
print(2)
test1.switch()
print(4)
test1.switch() test1=greenlet(fun1)
test2=greenlet(fun2)
test1.switch()
'''会有一个额外的东西进行检测和切换''' '''事件循环是外部来调配的''' '''阻塞的是当上一步完成之后才会执行下一步操作
而非阻塞是当上一步没有完成也会往下走 '''
 

协程,twisted的更多相关文章

  1. python之协程与IO操作

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...

  2. [转载]Python 3.5 协程究竟是个啥

    http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 协程究 ...

  3. [译] Python 3.5 协程究竟是个啥

    转自:http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 ...

  4. Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO

    本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO   1.  多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...

  5. python 自动化之路 day 10 协程、异步IO、队列、缓存

    本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目 ...

  6. Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

    Python之路,Day9 - 异步IO\数据库\队列\缓存   本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...

  7. python——进程、线程、协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env pytho ...

  8. 协程IO多路复用

    协程:单线程下实现并发并发:伪并行,遇到IO就切换,单核下多个任务之间切换执行,给你的效果就是貌似你的几个程序在同时执行.提高效率任务切换 + 保存状态并行:多核cpu,真正的同时执行串行:一个任务执 ...

  9. 11.python3标准库--使用进程、线程和协程提供并发性

    ''' python提供了一些复杂的工具用于管理使用进程和线程的并发操作. 通过应用这些计数,使用这些模块并发地运行作业的各个部分,即便是一些相当简单的程序也可以更快的运行 subprocess提供了 ...

随机推荐

  1. 50个最常用的Linux命令

    转载至:http://gywbd.github.io/posts/2014/8/50-linux-commands.html tar grep find ssh sed awk vim diff so ...

  2. [设计模式] javascript 之 命令模式

    模式定义: [定义]: 将一个请求封装成一个对象,使得你用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 组成: 调用者(Invoker),命令请求(Comman ...

  3. oracle pivot

    select * from (select a.drugname, a.drugform, a.drugspec, a.type flag, max(a.maxzjprice) maxprice, m ...

  4. Tomcat清理日志文件无法立即释放磁盘空间

    1 自己删除了Tomcat的日志文件,但是依然显示磁盘百分百占用 进入Tomcat目录显示日志已经删除 查询磁盘空间依旧百分百占用 2 自己杀死Tomcat进程然后重启,成功释放空间 3 原因,通过网 ...

  5. 多项式乘法(FFT)学习笔记

    ------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法  ...

  6. 列式数据库~clickhouse日常管理

    clickhouse日常管理一 变量相关  1 查看变量     system.setting相关表  2 设置变量     set variables= 请注意这里是session级别,如果想永久生 ...

  7. django 学习手册 - ORM 报错集(随时更新)

    报错问题: 问题一:(1050代码) django.db.utils.InternalError: (1050, "Table 'app01_group' already exists&qu ...

  8. Eclipse安装教程 ——史上最详细安装Java &Python教程说明

    参考链接:https://blog.csdn.net/zichen_ziqi/article/details/73995755

  9. openstack Q版部署-----界面horizon安装(9)

    一.界面的安装 控制节点安装软件包: yum install openstack-dashboard -y [root@linux-node1 ~]# vim /etc/openstack-dashb ...

  10. iris数据集(鸢尾花)

    包含三个花的品种(Iris setosa(山鸢尾),Iris virginica(北美鸢尾),Iris versicolor(变色鸢尾)) 每个品种各50个样 每个样本四个特征参数(萼片长度和宽度.花 ...