socket发送请求,协程

1.socket发送请求

 1 #发送请求的方式
 2
 3 #方式一
 4 import requests
 5
 6 ret = requests.get("https://www.baidu.com/s?wd=abc")
 7
 8 print(ret.text)
 9
10
11 #方式二
12
13 import socket
14
15 client = socket.socket()
16 client.connect(("www.baidu.com",80))
17 client.sendall(b"GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n")
18 chunk_list = []
19 while True:
20     chunk = client.recv(8096)
21     if not chunk:
22         break
23     chunk_list.append(chunk)
24
25 body = b"".join(chunk_list)
26 print(body.decode("utf-8"))

  单线程的并发

 1 import socket
 2 import select
 3
 4 client1 = socket.socket()
 5 client1.setblocking(False)#百度创建链接:非阻塞
 6
 7 try:
 8     client1.connect(("www.baidu.com",80))
 9 except BlockingIOError as e:
10     pass
11
12 client2 = socket.socket()
13 client2.setblocking(False)
14
15 try:
16     client2.connect(("www.baidu.com",80))
17 except BlockingIOError as e:
18     pass
19
20 client3 = socket.socket()
21 client3.setblocking(False)
22
23 try:
24     client3.connect(("www.baidu.com",80))
25 except BlockingIOError as e:
26     pass
27
28 socket_list = [client1,client2,client3]
29 conn_list = [client1,client2,client3]
30
31 while True:
32     rlist,wlist,elist = select.select(socket_list,conn_list,[],0.005)
33     for sk in wlist:
34         if sk == client1:
35             sk.sendall(b‘GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n‘)
36         elif sk == client2:
37             sk.sendall(b‘GET /web?query=fdf HTTP/1.0\r\nhost:www.sogou.com\r\n\r\n‘)
38         else:
39             sk.sendall(b‘GET /s?wd=alex HTTP/1.0\r\nhost:www.oldboyedu.com\r\n\r\n‘)
40         conn_list.remove(sk)
41     for sk in rlist:
42         chunk_list = []
43         while True:
44             try:
45                 chunk = sk.recv(8096)
46                 if not chunk:
47                     break
48                 chunk_list.append(chunk)
49             except BlockingIOError as e:
50                 break
51         body = b"".join(chunk_list)
52
53         sk.close()
54         socket_list.remove(sk)
55     if not socket_list:
56         break

2.协程

 1 import greenlet
 2
 3 def f1():
 4     print(111)
 5     g2.switch()
 6     print(222)
 7     g2.switch()
 8
 9 def f2():
10     print(333)
11     g1.switch()
12     print(444)
13
14 g1 = greenlet.greenlet(f1)
15 g2 = greenlet.greenlet(f2)
16 g1.switch()

协程的IO切换

 1 from gevent import monkey
 2 monkey.patch_all()
 3 import requests
 4 import gevent
 5
 6 def get_page1(url):
 7     ret = requests.get(url)
 8     print(url,ret.content)
 9
10 def get_page2(url):
11     ret = requests.get(url)
12     print(url,ret.content)
13
14 def get_page3(url):
15     ret = requests.get(url)
16     print(url,ret.content)
17
18 gevent.joinall(
19       gevent.spawn(get_page1,‘https://www.python.org/‘),
20       gevent.spawn(get_page2, ‘https://www.yahoo.com/‘),
21       gevent.spawn(get_page3, ‘https://github.com/‘)
22
23 )

原文地址:https://www.cnblogs.com/s593941/p/9643246.html

时间: 2024-10-12 23:42:30

socket发送请求,协程的相关文章

socket 发送请求

socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>20, "usec"=>0)); socket_connect($socket, 'www.baidu.com', 80); //里面的换行代表 \r\n 注意拷贝的代码后面可能有空格 $ht

Gevent的socket协程安全性分析

一般讨论socket的并发安全性,都是指线程的安全性...而且绝大多数的情况下socket都不是线程安全的.. 当然一些框架可能会对socket进行一层封装,让其成为线程安全的...例如java的netty框架就是如此,将socket封装成channel,然后让channel封闭到一个线程中,那么这个channel的所有的读写都在它所在的线程中串行的进行,那么自然也就是线程安全的了..... 其实很早看Gevent的源码的时候,就已经看过这部分的东西了,当时就已经知道gevent的socket不

基于ASIO的协程库orchid简介

什么是orchid? orchid是一个构建于boost库基础上的C++库,类似于python下的gevent/eventlet,为用户提供基于协程的并发模型. 什么是协程: 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态.协程在控制离开时暂停执行,当控制再次进入时只能从离开的位置继续执行. 协程已经被证明是一种非常有用的程序组件,不仅被python.lua.ruby等脚本语言广泛采用,而且被新一代面向多核的编程语言如golang

python协程:yield的使用

本文和大家分享的主要是python协程yield相关内容,一起来看看吧,希望对大家学习python有所帮助. 协程定义 协程的底层架构是在pep342 中定义,并在python2.5 实现的. python2.5 中,yield关键字可以在表达式中使用,而且生成器API中增加了 .send(value)方法.生成器可以使用.send(...)方法发送数据,发送的数据会成为生成器函数中yield表达式的值. 协程是指一个过程,这个过程与调用方协作,产出有调用方提供的值.因此,生成器可以作为协程使用

Python协程深入理解

从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数.yield在协程中的用法: 在协程中yield通常出现在表达式的右边,例如:datum = yield,可以产出值,也可以不产出--如果yield关键字后面没有表达式,那么生成器产出None. 协程可能从调用方接受数据,调用方是通过send(datum)的方式把数据提供给协程使用,而不是next(...)函数,通常调用方会把值推送给协程. 协程可以把控制器让给中心调度程序,从而激活其他的协程 所以总体上在协程中把yield看

Python协程深入理解(转)

原文:https://www.cnblogs.com/zhaof/p/7631851.html 从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数.yield在协程中的用法: 在协程中yield通常出现在表达式的右边,例如:datum = yield,可以产出值,也可以不产出--如果yield关键字后面没有表达式,那么生成器产出None. 协程可能从调用方接受数据,调用方是通过send(datum)的方式把数据提供给协程使用,而不是next(...)函数,通常调用方会把值推送

协程demo,1异步爬网页 2异步socket请求

一.异步爬网页 ''' 协程并发爬网页 ''' from urllib import request import gevent,time from gevent import monkey # 让gevent知道urllib里的哪些操作属于IO操作 monkey.patch_all() # 标记当前程序所有的IO操作 def f(url): print("GET:{0}".format(url)) resp = request.urlopen(url) data = resp.rea

今晚八点 golang 分享《如何在60分钟掌握 go 协程&管道 & socket 通信》

今晚八点 golang 分享<如何在60分钟掌握 go 协程&管道 & socket 通信> 内容如下: 功能演示 知识点学习 Golang 介绍 go 并发编程与通信 TCP/IP 协议族 socket 实战 使用 go net 模块开发 tcp 服务器与客户端 代码讲解 分享时间:2019.5.28——20:00-21:30 主讲人:kk 多语言混搭开发工程师,多年 PHP.Python 项目开发经验,带领团队完成多个中.小型项目开发.擅长于 Web 安全开发.性能优化.分

socket发送http请求

转自:思齐-socket发送http请求 socket方式: $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>20, "usec"=>0)); socket_connect($socket, 'www.baidu.com', 80); //里面的换行代表 \r