Code Monkey home page Code Monkey logo

aiotutorial's People

Contributors

denglj avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aiotutorial's Issues

希望作者能继续创作

结合500lines/crawler读了一下上篇,感觉收获很大,希望作者能继续创作中篇和下篇。
感谢!

期待中

我在等着看下边的,希望不要开始收费了……

Confusing in self._callbacks of Fulture

前辈您好,
Fulture类中您用了列表类型来保存 Task.step() 函数,
但是每个Fulture 只有一个回调函数啊,为什么要用列表呢?
我试着改了下:

class Future:
    def __init__(self):
        self.result = None
        self._callback = None

    def add_done_callback(self, fn):
        self._callback = fn

    def set_result(self, result):
        self.result = result
        if self._callback:
            self._callback(self)

感觉这样更简单啊,在下小白一个,请帮忙解惑 ^_^

设置非阻塞模式下会导致数据未准备就绪的问题

  • 设置为非阻塞模式时配合select事件循环时可读列表中的socket其实并不一定已准备就绪
#! -*- coding: utf-8 -*-


# author: [email protected]


import time
import select
import socket
import operator


# 静态类,零时存储可读可写连接
class Cache(object):
    can_read = {}
    can_write = {}


class Client(object):
    def __init__(self):
        self._socket = None

    def connect(self, host, port, uri, **kwargs):
        self._socket = socket.socket(**kwargs)
        # 设置此sock上的调用全部改为非阻塞
        self._socket.setblocking(False)
        try:
            # 非阻塞模式会抛异常
            self._socket.connect((host, port))
        except socket.error:
            pass
        # 创建完连接放入可写字典
        Cache.can_write[self._socket] = self

    def req_handle(self):
        _req = 'GET {0} HTTP/1.0\r\nHOST:{1}\r\n\r\n'.format(uri, host)
        self._socket.send(_req)
        # 发送完数据放入可读字典
        Cache.can_read[self._socket] = self

    def rsp_handle(self, buffersize=4096):
        _rsp = ''
        # select在非阻塞模式下可能出现误判导致数据未准备就绪,这里做一下简单处理
        while True:
            try:
                chunk = self._socket.recv(buffersize)
                while chunk:
                    _rsp += chunk
                    chunk = self._socket.recv(buffersize)
                break
            except socket.error:
                continue
        return _rsp


if __name__ == '__main__':
    results = []
    # 存存储耗时
    runcost = [time.time()]
    host, port, uri = '10.246.26.13', 80, '/ne_screen/jbscreen/lebo/screen/connect-totaltime/?from=2018-01-01&to=2018-12-3'
    for _ in xrange(20):
        c = Client()
        # 异步创建20个连接放入可写字典
        c.connect(host, port, uri)
    while True:
        # 处理完20个请求就退出
        if not Cache.can_read and not Cache.can_write:
            break
        # 监听读写事件
        rlist, wlist, _ = select.select(Cache.can_read, Cache.can_write, [])
        if rlist:
            # 可读就读取
            for sock in rlist:
                client = Cache.can_read.pop(sock)
                results.append(client.rsp_handle())
        if wlist:
            # 可写就请求
            for sock in wlist:
                client = Cache.can_write.pop(sock)
                client.req_handle()

    runcost.insert(0, time.time())
    print 'Request Times: {0}, Total Cost: {1} seconds'.format(
        len(results),
        operator.sub(*runcost)
    )

"""
Request Times: 20, Total Cost: 1.52134513855 seconds
"""
  • 设置非阻塞模式时被ssl.wrap_socket包装过的socket在后续异步回调读写都会有问题,数据都没有准备就绪

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.