关于文章 异步

asyncio eventloop python 多线程 异步

python 中的run_in_executor 和 run_on_executor 实现在异步中调用阻塞函数

python 异步是怎样练成的!

有个挺好玩的东西 python中asyncio 有两个函数 run_in_executorrun_on_executor

run_on_executor 用法

##这部分懒得写demo了 随意找地方复制的 = =

from concurrent.futures import ThreadPoolExecutor
from tornado.ioloop import IOLoop
from tornado.concurrent import run_on_executor

class SleepHandler(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(10)
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        start = time.time()
        res = yield self.sleep()
        self.write("when i sleep %f s" % (time.time() - start))
        self.finish()

    @run_on_executor
    def sleep(self):
        time.sleep(5)
        return 5

run_in_executor 用法

class Index(basic):
    async def get(self):
        name =  self.request.match_info.get('name', "Anonymous")
        text = "Hello, " + name
        loop = asyncio.get_event_loop()
        print(loop.__hash__())
        c = await  loop.run_in_executor(None,fuck,"asasas")
        return self.outJson(text=c)

def fuck(data)->str:
    return data+"async!!!"

似乎差别不是很大 = =

继续折腾!

asyncio nodejs python uvloop 事件 异步

tornado使用uvloop执行

tornado使用uvloop执行异步

asyncio 是Python3.4 之后引入的标准库的,这个包使用事件循环驱动的协程实现并发。

uvloop 是 基于libuv 代替 asyncio 内事件循环的库

livbuv 则是大名鼎鼎的nodejs使用的io库

= =

自打知道这玩意就想用上

上代码

import tornado.ioloop
import tornado.web
from .router import Url
from core.service import log
#入口文件
settings = {
    'template_path': 'views',
    'static_path': 'static',
    'static_url_prefix': '/static/',
    "cookie_secret" : "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
    "xsrf_cookies": False,
}

import uvloop

from tornado.platform.asyncio import BaseAsyncIOLoop


class TornadoUvloop(BaseAsyncIOLoop):

    def initialize(self, **kwargs):
        loop = uvloop.new_event_loop()
        try:
            super(TornadoUvloop, self).initialize(
                loop, close_loop=True, **kwargs)
        except Exception:
            loop.close()
            raise

    @staticmethod
    def main(port):
        application = tornado.web.Application(
            Url,
            **settings,)
        application.listen(port)
        tornado.ioloop.IOLoop.configure(TornadoUvloop)
        tornado.ioloop.IOLoop.current().start()
js读取文件 异步

js在浏览器环境取文件内容

js在浏览器环境取文件内容

//记得要文件读取完再取值  不然会是空值
 var jsonfile=$('.hideupdatefile')[0].files[0];
        var readjson = new FileReader();
        console.log(jsonfile)
        readjson.readAsText(jsonfile);

        readjson.onload = function(evt){ //读取完文件之后会回来这里
            var fileString = evt.target.result;
            editor.setValue(fileString);
        }