协程,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提供了 ...
随机推荐
- Less 创建css3动画@keyframes函数
封装: /** * animation */ .keyframes (@prefix,@name,@content) when (@prefix=def) { @keyframes @name { @ ...
- extjs.net Combox赋值
1.直接赋值 ].Rows) //遍历获取两个值 { Ext.Net.ListItem listItem = new Ext.Net.ListItem(); //每次创建一个Ext.Net.ListI ...
- Excel复制粘贴假死
把打印机都删除了试一下. 如果还有问题,就把迅雷监听关掉.
- 关于TCP/IOCP构架中出现的Socket假死连接解决方案
如果在2台不同的公网机器,对TCP的c/s做过详细的压力测试,那么很不幸,会有很多人发现自己的server端会出现大量的假死连接. 假死连接具体表现如下: 1.在s端机器上,会有一些处于TCP_EST ...
- 利用PHP连接数据库——实现用户数据的增删改查的整体操作实例
main页面(主页面) <table width="100%" border="1" cellpadding="0" cellspac ...
- SQL SERVER中一些常见性能问题的总结
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免使用 left join 和 null 值判断.left join 比 in ...
- python后端从数据库请求数据给到前端的具体实现
先来贴一窜代码让大家理解前端/后端/数据库的工作原理, 首先简要说明:前端向后端请求数据,后端根据前端请求数据的类别分析其需求,并连接到数据库获取相应数据: 来一段简单的实例代码模拟淘宝商城: 前端代 ...
- [css]将textarea前的文字设置在左上角
在使用textarea的时候,默认前面的文字是在最下面的,好丑,然后百度了一下,要在textarea加上vertical-align:top的css属性 代码: <div class=" ...
- centos7 安装.net core的方法
安装: sudo yum install libunwind libicu curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?li ...
- DIY一些基于netty的开源框架
几款基于netty的开源框架,有益于对netty的理解和学习! 基于netty的http server框架 https://github.com/TogetherOS/cicada 基于netty的即 ...