Python3使用tomorrow异步

Tomorrow源代码

项目地址
作者madisonmay

  1. from functools import wraps
  2. from concurrent.futures import ThreadPoolExecutor
  3. class Tomorrow():
  4. def __init__(self, future, timeout):
  5. self._future = future
  6. self._timeout = timeout
  7. self._wait = self._future.result
  8. def __getattr__(self, name):
  9. result = self._future.result(self._timeout)
  10. return result.__getattribute__(name)
  11. def async(n, base_type, timeout=None):
  12. def decorator(f):
  13. if isinstance(n, int):
  14. pool = base_type(n)
  15. elif isinstance(n, base_type):
  16. pool = n
  17. else:
  18. raise TypeError(
  19. "Invalid type: %s"
  20. % type(base_type)
  21. )
  22. @wraps(f)
  23. def wrapped(*args, **kwargs):
  24. return Tomorrow(
  25. pool.submit(f, *args, **kwargs),
  26. timeout=timeout
  27. )
  28. return wrapped
  29. return decorator
  30. def threads(n, timeout=None):
  31. return async(n, ThreadPoolExecutor, timeout)

示范代码

(虽然不如gevent方便,不如multiprocessing.dummy性能高,但是至少有了进度条功能

  1. import time
  2. import requests
  3. import sys
  4. from tomorrow import threads
  5. s=requests.Session()
  6. jishu=0
  7. @threads(10)
  8. def download(url):
  9. global jishu
  10. for _ in range(5):
  11. try:
  12. jishu+=1
  13. aa=s.get(url)
  14. sys.stderr.write(‘%s \r‘%jishu)
  15. except:
  16. pass
  17. return aa
  18. urls = [‘http://p.3.cn/prices/mgets?skuIds=J_1273600‘]*100
  19. if __name__ == "__main__":
  20. start = time.time()
  21. responses = [download(url) for url in urls]
  22. html = [response.text for response in responses]
  23. end = time.time()
  24. print ("Time: %f seconds" % (end - start))

来自为知笔记(Wiz)

时间: 2024-12-27 23:26:44

Python3使用tomorrow异步的相关文章

python3抓取异步百度瀑布流动态图片(二)get、json下载代码讲解

制作解析网址的get 1 def gethtml(url,postdata): 2 3 header = {'User-Agent': 4 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0', 5 'Referer': 6 'http://image.baidu.com', 7 'Host': 'image.baidu.com', 8 'Accept': 'text/plain, */*; q=0

唯品会数据采集-异步瀑布流

数据分析离不开数据的支持,为了分析唯品会,特地采集唯品会数据. 采集入口为手机端,在火狐浏览器下ctrl+shift+M进入手机模式,并点击触屏模式,进入唯品会网站m.vip.com,刷新网页. 点击右上角的搜索: 点击品牌: 这时候打开火狐的firebug,随便进入一个店铺,这时候系统会向唯品会发送一个post,可以在firebug里面找到这个post如下图: 点开+号,选择post: 可以看到框起来的部分就是发送的post.由于唯品会这里属于异步瀑布流加载,我们下拉页面,观察下一个post,

Python与协程从Python2—Python3

协程,又称微线程.纤程,英文名Coroutine:用一句话说明什么是线程的话:协程是一种用户态的轻量级线程. Python对于协程的支持在python2中还比较简单,但是也有可以使用的第三方库,在python3中开始全面支持,也成为python3的一个核心功能,很值得学习. 协程介绍 协程,又称微线程.纤程,英文名Coroutine:用一句话说明什么是线程的话:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先

【译】深入理解python3.4中Asyncio库与Node.js的异步IO机制

转载自http://xidui.github.io/2015/10/29/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3python3-4-Asyncio%E5%BA%93%E4%B8%8ENode-js%E7%9A%84%E5%BC%82%E6%AD%A5IO%E6%9C%BA%E5%88%B6/ 译者:xidui原文: http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html 译者前言 如

Python3 异步编程之进程与线程-1

Python3 异步编程之进程与线程-1 一.了解进程间通信 进程间通信 进程 线程 线程 vs 进程 IO模型 并发 vs 并行 异步 vs 同步 二.多线程与多进程的用法 计算密集型 vs I/O密集型 GIL 多线程 多进程 三.协程的好处与用法 协程 yield yield from 四.进程间通信-IPC 01 管道:无名管道和命名管道(FIFO) 消息队列 信号量 共享存储 Socket Streams 相关定义: 管道: 命名管道: 消息队列: 信号量: 共享内存: 元子操作: 五

tornado6与python3.7,异步新姿势

废话不多说,直接上代码 __auth__ = "aleimu" __doc__ = "学习tornado6.0+ 版本与python3.7+" import time import asyncio import tornado.gen import tornado.web import tornado.ioloop import tornado.httpserver # tornado的HTTP服务器实现 from tornado.options import de

python3+celery+redis实现异步任务

一.原理 Celery是基于Python开发的一个分布式任务队列框架,支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度.它是Python写的库,但是它实现的通讯协议也可以使用ruby,php,javascript等调用.异步任务除了消息队列的后台执行的方式,还是一种则是定时计划任务. Celery 是一个强大的分布式任务队列,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async task)和定时任务(crontab).它的架构组成

python3.6异步IO包asyncio部分核心源码思路梳理

关于python异步编程的演进过程,两篇文章阐述得妥妥当当,明明白白. 中文资料:https://mp.weixin.qq.com/s?__biz=MzIxMjY5NTE0MA==&mid=2247483720&idx=1&sn=f016c06ddd17765fd50b705fed64429c 英文资料:http://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html 其实中文资料就是参考的英文资料,英文资

python3 异步任务之----celery

celery是一个"自带电池"的任务队列. 运行环境: Django==1.11.4 PyMySQL==0.8.1 configparser==3.5.0 django-crontab==0.7.1 celery==3.1.25 redis==3.2.8 工程列表: 在工程下的settings.py文件中添加如下内容: BROKER_URL = 'redis://127.0.0.1:6379' CELERY_RESULT_BACKEND = 'redis://127.0.0.1:637