最原始的请求
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. Javaweb学习笔记——(二十一)——————过滤器

    过滤器     过滤器概述         1.什么是过滤器:             过滤器javaweb三大组件之一,它与Serlvet很相似,不过它过滤器是用来拦截请求的,而不是处理       ...

  2. Java EE之Hibernate异常总结org.hibernate.MappingException: Repeated column in mapping for entity:

    解决方案/原因: 一个pojo(JavaBean)中不能有两个属性同时映射到一个数据库字段上 即使是一个属性的两个getter方法也不行 %%%% Error Creating SessionFact ...

  3. JS中attribute和property的区别

    attribute是HTML标签上的特性,它的值只能够是字符串:html 上id,class property是JavaScript里定义的对象: 如var  obj={x:1,y:2}  ,这里x, ...

  4. luogu P4916 魔力环

    传送门 表示这种\(Burnside\)定理之类的东西一用就忘qwq 题目要求不同染色方案数,因为变换方式只有旋转,所以只有\(n\)个置换,然后可能会出现某种方案有循环节,这个循环节长度显然要是\( ...

  5. 【JS】空格分隔手机号

    '88888888888'.replace(/^(.{3})(.*)(.{4})$/, '$1 $2 $3')

  6. 微信小程序总结

    一.基础用法: <navigator url='跳转页面组件'></navigator>用法和a标签差不多 <text></text>文本标签 < ...

  7. Codeforces #662C Binary Table

    听说这是一道$ Tourist$现场没出的题 Codeforces #662C 题意: 给定$n*m的 01$矩阵,可以任意反转一行/列($0$变$1$,$1$变$0$),求最少$ 1$的数量 $ n ...

  8. jquery正则表达式

    参考链接:  http://www.bkjia.com/Javascript/1084651.html

  9. MGR架构 ~ 节点的维护相关问题

    一简介:MGR节点的相关维护二 两种情况   1 MGR读节点异常停止,然后重新启动加入节点进行数据同步   2 MGR读节点新加入集群成员,启动复制进行数据同步三 通用过程  1 新加入节点通过通道 ...

  10. TensorFlow学习笔记之--[tf.app.flags使用方法]

    很多时候在运行python代码的时候我们需要从外部定义参数,从而避免每次都需要改动代码.所以一般我们都会使用 argparse 这个库.其实TensorFlow也提供了这个功能,那就是 tf.app. ...