python 使用@run_on_executor 创建线程,后台执行并check(2)

来源:互联网 发布:阿里云手机空间 编辑:程序博客网 时间:2024/06/10 16:51

1,后台执行第二个方法


本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/78617643
未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

之前写过一个博客。
http://blog.csdn.net/freewebsys/article/details/78607822
使用threadPool的方式创建线程的。现在换一个方式。

2,说明


使用python的@run_on_executor 创建线程池,然后异步执行返回一个随机数字。
必须定义一个executor的属性,然后run_on_executor 注解才管用。
executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)

这个数字假设就是 tid,然后讲计算结果放到 map里面存储。
如果map 里面有 tid 的数据,则说明已经执行完毕。
同时前段使用 setInterval 定时执行check 方法。
然后检查成功之后 使用clearInterval 关闭循环。

代码如下:

#!/usr/bin/python3# -*- coding: utf-8 -*-import timefrom tornado.httpserver import HTTPServerfrom tornado.ioloop import IOLoopfrom tornado.web import Application, asynchronous, RequestHandlerfrom tornado import genfrom tornado.concurrent import run_on_executorfrom concurrent.futures import ThreadPoolExecutor# `pip install futures` for python2# https://gist.github.com/methane/2185380 参考html_content = """<!DOCTYPE html><html lang="zh-CN"><head>      <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script></head><body>    <h1>任务测试</h1></br>    <button id="job">开始</button></body></html><script type="text/javascript">    function job_check(timer,tid) {        $.ajax({           type: "GET",           url: "job_check?tid="+tid,           success: function(msg){                console.log(msg);                if(msg != ""){                    alert( "任务结果: " + msg );                    clearInterval(timer);//结束轮询                }            }        });    }    jQuery(function($) {        $("#job").click( function () {            $.ajax({               type: "GET",               url: "add_job",               success: function(tid){                    alert( "开始任务: " + tid );                    timer = setInterval(function(){                        console.log("run.");                        job_check(timer,tid);                    },1000);               }            });        });    })</script>"""class MainPage(RequestHandler):    def get(self):        self.write(html_content)MAX_WORKERS = 4_result = {}class AddJobHandler(RequestHandler):    # 必须定义一个executor的属性,然后run_on_executor 注解才管用。    executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)    @run_on_executor  # 标记成后台程序执行。    def background_task(self, tid):        time.sleep(10)  # 传递参数 10 秒。        _result[tid] = {"finish"}    @gen.coroutine    def get(self):        tid = str(int(time.time() * 10000))        self.background_task(tid)        self.write(tid)class JobCheckHandler(RequestHandler):    def get(self):        tid = self.get_argument("tid")        if tid in _result.keys():            out = _result[tid]  # 结果            del _result[tid]  # 删除tid的数据。            self.write(str(out))        else:            self.write("")# main 启动。if __name__ == "__main__":    HTTPServer(Application([        ("/", MainPage),        ("/add_job", AddJobHandler),        ("/job_check", JobCheckHandler)    ], debug=True)).listen(9999)    print("start web .")    IOLoop.instance().start()

3,演示效果


前端的js 使用的是百度的cdn。速度还可以呢。
http://cdn.code.baidu.com/

4,总结


python 写几个代码还是非常的方便的,开发效率超级的高呢。
使用python 执行一个后台的代码也是非常的快的。

默认下,tornado 支持一些异步执行。也可以研究下使用。
http://tornado.readthedocs.io/en/stable/gen.html

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/78617643
未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

阅读全文
0 0
原创粉丝点击