# -*- coding: utf-8 -*-
# @Time : 2018/12/15 18:55
# @File : coroutine.py #一个简单的 Coroutine 框架 import socket # on top of TCP
import time
from selectors import DefaultSelector, EVENT_WRITE, EVENT_READ
# select: System Call -----> watch the readiness of a unix-file(socket) i/o
# only socket is possible in Windows
# non-blocking socket selector = DefaultSelector() class Future: # ~=Promise, return the caller scope a promise
# about something in the future
def __init__(self):
self.callbacks = [] def resolve(self): # on future event callback
for func in self.callbacks:
func() class Task: # responsible for calling next() on generators
# in charge of the async functions
def __init__(self, gen, eventLoop):
self.gen = gen
self.step() def step(self): # go to next step/next yield
try:
f = next(self.gen)
f.callbacks.append(self.step)
except StopIteration as e:
# Task is finished
eventLoop.n_task -= 1 class EventLoop:
def __init__(self):
self.n_task = 0 def add_task(self, generator):
self.n_task += 1
Task(generator, self) def start(self):
while self.n_task > 0:
events = selector.select()
for event, mask in events:
f = event.data
f.resolve() def pause(s, event):
f = Future()
selector.register(s.fileno(), event, data=f)
yield f # pause this function def resume(s):
selector.unregister(s.fileno()) def async_await(s, event):
yield from pause(s, event)
resume(s) def async_get(path):
s = socket.socket()
s.setblocking(False)
try:
s.connect(('localhost', 3000))
except BlockingIOError as e:
print(e) yield from async_await(s, EVENT_WRITE) request = 'GET %s HTTP/1.0\r\n\r\n' % path
s.send(request.encode()) totalReceived = []
while True:
yield from async_await(s, EVENT_READ) received = s.recv(1000)
if received:
totalReceived.append(received)
else:
body = (b''.join(totalReceived)).decode()
print('--------------------------------------')
print(body)
print('--------------------------------------', 'Byte Received:', len(body), '\n\n')
return if __name__ == '__main__':
start = time.time()
eventLoop = EventLoop() for i in range(50):
eventLoop.add_task(async_get('/super-slow')) eventLoop.start() print('%.1f sec' % (time.time() - start))

  

[记录]python的简单协程框架(回调+时间循环+select)的更多相关文章

  1. [转载]Python 3.5 协程究竟是个啥

    http://blog.rainy.im/2016/03/10/how-the-heck-does-async-await-work-in-python-3-5/ [译] Python 3.5 协程究 ...

  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 IO 多路复用 \协程

    IO 多路复用 作用:  检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据) 即(可读/可写) IO请求时 解决并发  :  单线程 def get_data(key): cl ...

  4. python线程、协程、I/O多路复用

    目录: 并发多线程 协程 I/O多路复用(未完成,待续) 一.并发多线程 1.线程简述: 一条流水线的执行过程是一个线程,一条流水线必须属于一个车间,一个车间的运行过程就是一个进程(一个进程内至少一个 ...

  5. python中的协程并发

    python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...

  6. python爬虫——多线程+协程(threading+gevent)

    上一篇博客中我介绍了如何将爬虫改造为多进程爬虫,但是这种方法对爬虫效率的提升不是非常明显,而且占用电脑cpu较高,不是非常适用于爬虫.这篇博客中,我将介绍在爬虫中广泛运用的多线程+协程的解决方案,亲测 ...

  7. 第十一章:Python高级编程-协程和异步IO

    第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...

  8. Python中异步协程的使用方法介绍

    1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...

  9. Python中Paramiko协程方式详解

    什么是协程 协程我们可以看做是一种用户空间的线程. 操作系统对齐存在一无所知,需要用户自己去调度. 比如说进程,线程操作系统都是知道它们存在的.协程的话是用户空间的线程,操作系统是不知道的. 为什么要 ...

随机推荐

  1. Chinese Messy Code of String

    It's very strange that I found the messy code.I 've never seen this before. this is the java code: / ...

  2. delphi读取ini文件

    ini文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以可视化的编程一族,如vb.vc.vfp.delphi等都提供了读写ini文件的方法,其中delphi中操作ini文件,最为简洁, ...

  3. SharePoint Add-in Model 介绍 - 引文(先导篇)

    1. SharePoint 平台 如果你已经很熟悉 SharePoint 平台,可跳过本章节. 1.1 SharePoint 是什么 在介绍 Add-in Model 之前,简要提一下 SharePo ...

  4. Zookeeper zkui-zookeeper图形化管理工具

    zkui zkui是一个Zookeeper可视化管理工具. Github:https://github.com/DeemOpen/zkui zkui安装 1.Git拉取代码 #git clone ht ...

  5. 在DBGrid增加一列CheckBox(而非DBCheckBox)

    自:http://rabbitfox.blog.sohu.com/33264033.html http://community.csdn.net/Expert/topic/5342/5342920.x ...

  6. 核心思想:自由职业的所谓自由,必须先职业,然后才能自由(还要对抗自己的惰性,提前寻找客户)good

    除了前面提到的专业性,还要足够自律,能够管理好自己的时间和精力. 具体来说,需要目标管理和时间(精力)管理. 所谓目标管理,对于自由职业者来讲,就是要识别出自己最擅长的方向,确立自己可以提供的最有价值 ...

  7. iOS密码框实现(二)取消确定按钮

    由于将确定按钮去掉了,所以需要重新修改下代码,当输入第四个数字时,自动进入房间.   iOS 密码框效果图:     实现方式:   首先声明一个block初始化方法,因为这只是个框框,并不需要处理网 ...

  8. DHCP服务部署流程

    为某一局域网部署DHCP [root@dhcp ~]# yum install -y dhcp[root@dhcp ~]# rpm -ql dhcp/usr/sbin/dhcpd:dhcp服务进程 / ...

  9. kubernetes实战篇之创建密钥自动拉取私服镜像

    系列目录 前面我们讲解了如何搭建nexus服务器,以及如何使用nexus搭建docker私有镜像仓库,示例中我们都是手动docker login登陆私服,然后通过命令拉取镜像然后运行容器.然而这种做法 ...

  10. 移动端使用rem.js,解决rem.js 行内元素占位问题

    父级元素: letter-spacing: -0.5em;font-size: 0; 子级元素: letter-spacing: normal; display: inline-block; vert ...