socket发送请求,协程
1.socket发送请求
#发送请求的方式 #方式一
import requests ret = requests.get("https://www.baidu.com/s?wd=abc") print(ret.text) #方式二 import socket client = socket.socket()
client.connect(("www.baidu.com",80))
client.sendall(b"GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n")
chunk_list = []
while True:
chunk = client.recv(8096)
if not chunk:
break
chunk_list.append(chunk) body = b"".join(chunk_list)
print(body.decode("utf-8"))
单线程的并发
import socket
import select client1 = socket.socket()
client1.setblocking(False)#百度创建链接:非阻塞 try:
client1.connect(("www.baidu.com",80))
except BlockingIOError as e:
pass client2 = socket.socket()
client2.setblocking(False) try:
client2.connect(("www.baidu.com",80))
except BlockingIOError as e:
pass client3 = socket.socket()
client3.setblocking(False) try:
client3.connect(("www.baidu.com",80))
except BlockingIOError as e:
pass socket_list = [client1,client2,client3]
conn_list = [client1,client2,client3] while True:
rlist,wlist,elist = select.select(socket_list,conn_list,[],0.005)
for sk in wlist:
if sk == client1:
sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n')
elif sk == client2:
sk.sendall(b'GET /web?query=fdf HTTP/1.0\r\nhost:www.sogou.com\r\n\r\n')
else:
sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.oldboyedu.com\r\n\r\n')
conn_list.remove(sk)
for sk in rlist:
chunk_list = []
while True:
try:
chunk = sk.recv(8096)
if not chunk:
break
chunk_list.append(chunk)
except BlockingIOError as e:
break
body = b"".join(chunk_list) sk.close()
socket_list.remove(sk)
if not socket_list:
break
2.协程
import greenlet def f1():
print(111)
g2.switch()
print(222)
g2.switch() def f2():
print(333)
g1.switch()
print(444) g1 = greenlet.greenlet(f1)
g2 = greenlet.greenlet(f2)
g1.switch()
协程的IO切换
from gevent import monkey
monkey.patch_all()
import requests
import gevent def get_page1(url):
ret = requests.get(url)
print(url,ret.content) def get_page2(url):
ret = requests.get(url)
print(url,ret.content) def get_page3(url):
ret = requests.get(url)
print(url,ret.content) gevent.joinall(
gevent.spawn(get_page1,'https://www.python.org/'),
gevent.spawn(get_page2, 'https://www.yahoo.com/'),
gevent.spawn(get_page3, 'https://github.com/') )
socket发送请求,协程的更多相关文章
- 分析Tornado的协程实现
		
转自:http://www.binss.me/blog/analyse-the-implement-of-coroutine-in-tornado/ 什么是协程 以下是Wiki的定义: Corouti ...
 - python_21_线程+进程+协程
		
python_线程_进程_协程 什么是线程? -- os能够进行运算调度的最小单位,被包含在进程之中,是一串指令的集合 -- 每个线程都是独立的,可以访问同一进程下所有的资源 什么是进程? -- 每个 ...
 - day 35 协程 IO多路复用
		
0.基于socket发送Http请求 import socket import requests # 方式一 ret = requests.get('https://www.baidu.com/s?w ...
 - 基于ASIO的协程库orchid简介
		
什么是orchid? orchid是一个构建于boost库基础上的C++库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型. 什么是协程: 协程,即协作式程序,其思 ...
 - 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
		
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
 - Day 42 协程. IO 并发
		
一.什么是协程? 是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程切换效率更快了. ...
 - C++20协程实例:携程化的IOCP服务端/客户端
		
VC支持协程已经有一段时间了,之前一直想不明白协程的意义在哪里,前几天拉屎的时候突然灵光一闪: 以下是伪代码: task server() { for (;;) { sock_context s = ...
 - python中协程的使用示例
		
例子1 把字符串分割为列表 def line_splitter( delimiter = None ): print( 'ready to split' ) result = None while T ...
 - Python协程深入理解
		
从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数.yield在协程中的用法: 在协程中yield通常出现在表达式的右边,例如:datum = yield,可以产出值,也可以不产出 ...
 
随机推荐
- xe5 for android 地理定位GPS
			
先上源码,在解释. implementation uses androidapi.jni.JavaTypes, androidapi.jni.Location, FMX.helpers.android ...
 - 获取其他进程中“Internet Explorer_TridentCmboBx”的内容
			
function GetTridentCmboBxText( // 获取其他进程中“Internet Explorer_TridentCmboBx”的内容 mHandle: THandle; // ...
 - dpkg:处理 xxx (--configure)时出错解决方案
			
出现问题如下: 正在设置 nfs-common (1:1.2.2-4ubuntu5) ... dpkg:处理 nfs-common (--configure)时出错: 子进程 已安装 post-in ...
 - Linux使用daemontools
			
功能: 在使用memcached时候,怕因为一些不可预知的因素导致memcached进程死掉,而又不能及时的发现重启,可以通过daemontools来管理memcached的启动,当memcached ...
 - ASP.NET MVC3在Visual Studio 2010中的变化
			
在VS2010中新建一个MVC3项目可以看出与以往的MVC2发生了很明显的变化 1.ASP.NET MVC3必要的运行环境为.NET 4.0 (想在3.5用MVC3,没门!) 2.默认MVC3模板项目 ...
 - Java集合 ArrayList原理及使用
			
ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口.Collection是所有集合类的父类.ArrayList使用非常广泛,不论是数据库表查询,exce ...
 - canvas的进阶 - 学习利用canvas做一个炫酷的倒计时功能
			
先给大家贴一张图片,因为我不会上传视频( ̄□ ̄||) ,请大家谅解了~ 如果有知道怎么上传视频的大神还请指点指点 ^_^ ~ 然后看一下代码: html部分 : <!DOCTYPE html ...
 - ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理
			
我们了解ABP框架内部自动记录审计日志和登录日志的,但是这些信息只是在相关的内部接口里面进行记录,并没有一个管理界面供我们了解,但是其系统数据库记录了这些数据信息,我们可以为它们设计一个查看和导出这些 ...
 - React躬行记(2)——JSX
			
JSX既不是字符串,也不是HTML,而是一种类似XML,用于描述用户界面的JavaScript扩展语法,如下代码所示.在使用JSX时,为了避免自动插入分号时出现问题,推荐在其最外层用圆括号包裹,并且必 ...
 - org.springframework.beans.factory.BeanCreationException: Could not autowire field  org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [com.xxxx.service.sys.impl.ProcEn
			
七月 01, 2019 4:34:20 下午 org.apache.catalina.core.StandardContext listenerStart .....org.springframewo ...