协程,twisted
最原始的请求
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的更多相关文章
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
- [转载]Python 3.5 协程究竟是个啥
http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 协程究 ...
- [译] Python 3.5 协程究竟是个啥
转自:http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 ...
- Python自动化 【第十篇】:Python进阶-多进程/协程/事件驱动与Select\Poll\Epoll异步IO
本节内容: 多进程 协程 事件驱动与Select\Poll\Epoll异步IO 1. 多进程 启动多个进程 进程中启进程 父进程与子进程 进程间通信 不同进程间内存是不共享的,要想实现两个进程间 ...
- python 自动化之路 day 10 协程、异步IO、队列、缓存
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Twsited网络框架 引子 到目 ...
- Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列
Python之路,Day9 - 异步IO\数据库\队列\缓存 本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitM ...
- python——进程、线程、协程
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env pytho ...
- 协程IO多路复用
协程:单线程下实现并发并发:伪并行,遇到IO就切换,单核下多个任务之间切换执行,给你的效果就是貌似你的几个程序在同时执行.提高效率任务切换 + 保存状态并行:多核cpu,真正的同时执行串行:一个任务执 ...
- 11.python3标准库--使用进程、线程和协程提供并发性
''' python提供了一些复杂的工具用于管理使用进程和线程的并发操作. 通过应用这些计数,使用这些模块并发地运行作业的各个部分,即便是一些相当简单的程序也可以更快的运行 subprocess提供了 ...
随机推荐
- Ext.net NumberField要设置MinValue,MaxValue
<Items> <ext:NumberField ID="NumberField1" runat="server" FieldLabel=&q ...
- Groovy的脚本统一于类的世界
http://groovy-lang.org/structure.html 3.2. Script class A script is always compiled into a class. Th ...
- postfix 邮箱接收限制
Postfix 限制 QQ 邮箱发送到 我的 test.com 域下邮箱. 1.编辑 main.cf 添加限制: smtpd_sender_restrictions = check_sender_a ...
- [C++]2-5 分数化小数
/* 分数化小数 输入正整数a,b,c,输出a/b的小数形式.精确到小数点后C位.a,b<=10^6,c<=10^6. 输入包含多组数据,结束标记为a=b=c=0 样例输入: 1 6 4 ...
- 基于TensorFlow Object Detection API进行相关开发的步骤
*以下二/三.四步骤确保你当前的文件目录是以research文件夹为相对目录. 一/安装或升级protoc 查看protoc版本命令: protoc --version 如果发现版本低于2.6.0或运 ...
- vue使用element-ui的el-input监听不了键盘事件解决
vue使用element-ui的el-input监听不了键盘事件,原因应该是element-ui自身封装了一层div在input标签外面,把原来的事件隐藏了,所以如下代码运行是无响应的: <el ...
- mongodb系列~配置文件的优化与处理
一 简介:讲讲如何优化mongo配置文件二 常规参数 port= //端口 fork=true//守护进程方式启动mongo logpath=shard.log //mongo ...
- Android RecyclerView 瀑布流滑动到最后自动加载更多
mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener(){ //用来标记是否正在向最后一个滑动,既是否向下滑动 bool ...
- 如何访问IPV6?很简单,几个命令行即可。
参考:清华大学ISATAP隧道配置方法 简单介绍一下windows下的配置方法,其他系统的配置方法详见上面提供的个链接. 首先打卡管理员权限的命令行窗口,依次输入如下命令即可 netsh int ip ...
- ActiveMQ 动态网络链接
ActiveMQ的broker-broker方式有两种,一种 静态连接一种是动态连接,一般使用静态连接,动态连接了解就好,没有过多的去测试. 1. 多播协议multicast ActiveMQ使用Mu ...