RxPY

RxPY 是 ReactiveX 的 Python语言实现。

  1. # 安装 RxPY
  2. $ pip3 install rx
  3. Successfully installed rx-1.6.1

Basics

  1. from rx import Observable
  2. source = Observable.of("Alpha", "Beta", "Gamma", "Delta", "Epsilon")
  3. source.subscribe(on_next=lambda value: print("Received {0}".format(value)),
  4. on_completed=lambda: print("Done!"),
  5. on_error=lambda error: print("Error Occurred: {0}".format(error))
  6. )
  7. '''
  8. Received Alpha
  9. Received Beta
  10. Received Gamma
  11. Received Delta
  12. Received Epsilon
  13. Done!
  14. '''

Operators

  1. from rx import Observable
  2. Observable.of("Alpha", "Beta", "Gamma", "Delta", "Epsilon") \
  3. .map(lambda s: len(s)) \
  4. .filter(lambda i: i >= 5) \
  5. .subscribe(lambda value: print("Received {0}".format(value)))
  6. '''
  7. Received 5
  8. Received 5
  9. Received 5
  10. Received 7
  11. '''

Events

  1. from rx import Observable
  2. Observable.interval(1000) \
  3. .map(lambda i: "{0} Mississippi".format(i)) \
  4. .subscribe(lambda s: print(s))
  5. input("Press any key to quit\n")
  6. '''
  7. Press any key to quit
  8. 0 Mississippi
  9. 1 Mississippi
  10. 2 Mississippi
  11. 3 Mississippi
  12. 4 Mississippi
  13. ...
  14. '''

Multicasting

  1. from rx import Observable
  2. from random import randint
  3. three_emissions = Observable.range(1, 3)
  4. three_random_ints = three_emissions.map(lambda i: randint(1, 100000))
  5. three_random_ints.subscribe(lambda i: print("Subscriber 1 Received: {0}".format(i)))
  6. three_random_ints.subscribe(lambda i: print("Subscriber 2 Received: {0}".format(i)))
  7. '''
  8. Subscriber 1 Received: 76795
  9. Subscriber 1 Received: 19486
  10. Subscriber 1 Received: 96809
  11. Subscriber 2 Received: 79148
  12. Subscriber 2 Received: 33423
  13. Subscriber 2 Received: 3319
  14. '''
  1. from rx import Observable
  2. from random import randint
  3. three_emissions = Observable.range(1, 3)
  4. three_random_ints = three_emissions.map(lambda i: randint(1, 100000)).publish()
  5. three_random_ints.subscribe(lambda i: print("Subscriber 1 Received: {0}".format(i)))
  6. three_random_ints.subscribe(lambda i: print("Subscriber 2 Received: {0}".format(i)))
  7. three_random_ints.connect()
  8. '''
  9. Subscriber 1 Received: 83159
  10. Subscriber 2 Received: 83159
  11. Subscriber 1 Received: 82025
  12. Subscriber 2 Received: 82025
  13. Subscriber 1 Received: 72397
  14. Subscriber 2 Received: 72397
  15. '''
  1. from rx import Observable
  2. from random import randint
  3. three_emissions = Observable.range(1, 3)
  4. three_random_ints = three_emissions.map(lambda i: randint(1, 100000)).publish().auto_connect(2)
  5. three_random_ints.subscribe(lambda i: print("Subscriber 1 Received: {0}".format(i)))
  6. three_random_ints.subscribe(lambda i: print("Subscriber 2 Received: {0}".format(i))) # second subscriber triggers firing
  7. '''
  8. Subscriber 1 Received: 72527
  9. Subscriber 2 Received: 72527
  10. Subscriber 1 Received: 53066
  11. Subscriber 2 Received: 53066
  12. Subscriber 1 Received: 32249
  13. Subscriber 2 Received: 32249
  14. '''

Combining

  1. from rx import Observable
  2. letters = Observable.of("Alpha", "Beta", "Gamma", "Delta", "Epsilon")
  3. intervals = Observable.interval(1000)
  4. Observable.zip(letters, intervals, lambda s, i: (s, i)) \
  5. .subscribe(lambda t: print(t))
  6. input("Press any key to quit\n")
  7. '''
  8. Press any key to quit
  9. ('Alpha', 0)
  10. ('Beta', 1)
  11. ('Gamma', 2)
  12. ('Delta', 3)
  13. ('Epsilon', 4)
  14. '''

Concurrency

  1. import multiprocessing
  2. import random
  3. import time
  4. from threading import current_thread
  5. from rx import Observable
  6. from rx.concurrency import ThreadPoolScheduler
  7. def intense_calculation(value):
  8. # sleep for a random short duration between 0.5 to 2.0 seconds to simulate a long-running calculation
  9. time.sleep(random.randint(5, 20) * .1)
  10. return value
  11. # calculate number of CPU's, then create a ThreadPoolScheduler with that number of threads
  12. optimal_thread_count = multiprocessing.cpu_count()
  13. pool_scheduler = ThreadPoolScheduler(optimal_thread_count)
  14. # Create Process 1
  15. Observable.of("Alpha", "Beta", "Gamma", "Delta", "Epsilon") \
  16. .map(lambda s: intense_calculation(s)) \
  17. .subscribe_on(pool_scheduler) \
  18. .subscribe(on_next=lambda s: print("PROCESS 1: {0} {1}".format(current_thread().name, s)),
  19. on_error=lambda e: print(e),
  20. on_completed=lambda: print("PROCESS 1 done!"))
  21. # Create Process 2
  22. Observable.range(1, 10) \
  23. .map(lambda s: intense_calculation(s)) \
  24. .subscribe_on(pool_scheduler) \
  25. .subscribe(on_next=lambda i: print("PROCESS 2: {0} {1}".format(current_thread().name, i)),
  26. on_error=lambda e: print(e), on_completed=lambda: print("PROCESS 2 done!"))
  27. # Create Process 3, which is infinite
  28. Observable.interval(1000) \
  29. .map(lambda i: i * 100) \
  30. .observe_on(pool_scheduler) \
  31. .map(lambda s: intense_calculation(s)) \
  32. .subscribe(on_next=lambda i: print("PROCESS 3: {0} {1}".format(current_thread().name, i)),
  33. on_error=lambda e: print(e))
  34. input("Press any key to exit\n")
  35. '''
  36. Press any key to exit
  37. PROCESS 1: ThreadPoolExecutor-1_0 Alpha
  38. PROCESS 1: ThreadPoolExecutor-1_0 Beta
  39. PROCESS 2: ThreadPoolExecutor-1_1 1
  40. PROCESS 3: ThreadPoolExecutor-1_2 0
  41. PROCESS 2: ThreadPoolExecutor-1_1 2
  42. PROCESS 1: ThreadPoolExecutor-1_0 Gamma
  43. PROCESS 3: ThreadPoolExecutor-1_2 100
  44. PROCESS 2: ThreadPoolExecutor-1_1 3
  45. PROCESS 1: ThreadPoolExecutor-1_0 Delta
  46. PROCESS 3: ThreadPoolExecutor-1_4 200
  47. PROCESS 1: ThreadPoolExecutor-1_0 Epsilon
  48. PROCESS 1 done!
  49. PROCESS 2: ThreadPoolExecutor-1_1 4
  50. PROCESS 2: ThreadPoolExecutor-1_1 5
  51. PROCESS 3: ThreadPoolExecutor-1_5 300
  52. PROCESS 2: ThreadPoolExecutor-1_1 6
  53. PROCESS 3: ThreadPoolExecutor-1_2 400
  54. PROCESS 3: ThreadPoolExecutor-1_2 500
  55. PROCESS 2: ThreadPoolExecutor-1_1 7
  56. PROCESS 3: ThreadPoolExecutor-1_2 600
  57. PROCESS 2: ThreadPoolExecutor-1_1 8
  58. PROCESS 3: ThreadPoolExecutor-1_2 700
  59. PROCESS 2: ThreadPoolExecutor-1_1 9
  60. PROCESS 3: ThreadPoolExecutor-1_2 800
  61. PROCESS 2: ThreadPoolExecutor-1_1 10
  62. PROCESS 2 done!
  63. PROCESS 3: ThreadPoolExecutor-1_2 900
  64. PROCESS 3: ThreadPoolExecutor-1_2 1000
  65. PROCESS 3: ThreadPoolExecutor-1_2 1100
  66. PROCESS 3: ThreadPoolExecutor-1_2 1200
  67. PROCESS 3: ThreadPoolExecutor-1_2 1300
  68. PROCESS 3: ThreadPoolExecutor-1_2 1400
  69. PROCESS 3: ThreadPoolExecutor-1_2 1500
  70. PROCESS 3: ThreadPoolExecutor-1_2 1600
  71. PROCESS 3: ThreadPoolExecutor-1_2 1700
  72. PROCESS 3: ThreadPoolExecutor-1_2 1800
  73. ...
  74. '''

Alignment

  1. from rx import Observable, Observer
  2. xs = Observable.of(1,2,3)
  3. ys = Observable.of(4,5,6)
  4. zs = xs + ys # Concatenate observables
  5. zs.to_list().subscribe(lambda value: print(value))
  6. xs = Observable.of(1,2,3)
  7. ys = xs * 4
  8. ys.to_list().subscribe(lambda value: print(value))
  9. xs = Observable.of(1,2,3)
  10. ys = xs[1:-1]
  11. ys.to_list().subscribe(lambda value: print(value))
  12. xs = Observable.of(1,2,3,4,5,6)
  13. ys = xs.to_blocking()
  14. zs = (x*x for x in ys if x > 3)
  15. for x in zs:
  16. print(x)
  17. '''
  18. [1, 2, 3, 4, 5, 6]
  19. [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
  20. [2]
  21. 16
  22. 25
  23. 36
  24. '''

ReactiveX 学习笔记(16)RxPY的更多相关文章

  1. ReactiveX 学习笔记(0)学习资源

    ReactiveX 学习笔记 ReactiveX 学习笔记(1) ReactiveX 学习笔记(2)创建数据流 ReactiveX 学习笔记(3)转换数据流 ReactiveX 学习笔记(4)过滤数据 ...

  2. Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行

    Ext.Net学习笔记16:Ext.Net GridPanel 折叠/展开行 Ext.Net GridPanel的行支持折叠/展开功能,这个功能个人觉得还说很有用处的,尤其是数据中包含图片等内容的时候 ...

  3. SQL反模式学习笔记16 使用随机数排序

    目标:随机排序,使用高效的SQL语句查询获取随机数据样本. 反模式:使用RAND()随机函数 SELECT * FROM Employees AS e ORDER BY RAND() Limit 1 ...

  4. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  5. [原创]java WEB学习笔记16:JSP指令(page,include),JSP标签(forwar,include,param)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. Adaptive AUTOSAR 学习笔记 16 - 时间同步和网络管理

    本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf.作者:Zijian/TENG 原文地 ...

  7. ArcGIS API for JavaScript 4.2学习笔记[16] 弹窗自定义功能按钮及为要素自定义按钮(第五章完结)

    这节对Popups这一章的最后两个例子进行介绍和解析. 第一个[Popup Actions]介绍了弹窗中如何自定义工具按钮(名为actions),以PopupTemplate+FeatureLayer ...

  8. ReactiveX 学习笔记(20)使用 RxJava + RxBinding 进行 GUI 编程

    课题 程序界面由3个文本编辑框和1个文本标签组成. 要求文本标签实时显示3个文本编辑框所输入的数字之和. 文本编辑框输入的不是合法数字时,将其值视为0. 3个文本编辑框的初值分别为1,2,3. 创建工 ...

  9. ReactiveX 学习笔记(14)使用 RxJava2 + Retrofit2 调用 REST API

    JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...

随机推荐

  1. c#类 对象 构造函数 析构函数——面向对象

    类: 也是复杂数据类型 也是需要我们先定义出类型,才能使用它的数据 对象: 是通过模板类实例化出来的个体,具有具体的属性和行为(方法),对象是不能索引到静态方法. 对象的生命周期 构造—— 使用—— ...

  2. (转)C#实现注册码

    原文地址:http://www.cnblogs.com/netcorner/archive/2011/08/31/2911922.html 开发软件时,当用到商业用途时,注册码与激活码就显得很重要了. ...

  3. pthread mutex

    pthead_mutex_t mutex; 1:create: pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t ...

  4. window安装mysql教程

    1.下载mysql安装包到指定文件: 比如如图我把下载的mysql zip的内容解压到这个文件里面,具体文件内容如下: my.ini 需要自己创建,里面的内容如下: [mysqld] #basedir ...

  5. angularjs中ng-repeat插入图片

    <tr ng-repeat="item in datas" ng-module="datas"> <td> <img class ...

  6. flask 之request用法

    每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的 为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互 基于HTML + Flask 写一 ...

  7. Git上传项目失败:Push rejected: Push to origin/master was rejected

    解决方案如下: 1.切换到自己项目所在的目录,右键选择GIT BASH Here,Idea中可使用Alt+F12 打开终端 2.在terminl窗口中依次输入命令: git pull git pull ...

  8. 接口详解例子代码(附Java1.8的接口新特性)

    接口,与抽象类类似但是区别也很大,他们都是标签,用来提醒父类一定要实现的类里创建抽象方法.而接口类可以implements 多个接口,抽象类则只能父类只能继承一个抽象类,与抽象不同的是它不是继承组合关 ...

  9. 判断B是不是A的子结构

    题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构)   解答: class Solution:    def HasSubtree(self, pRo ...

  10. 8.Appium的基本使用-2(安装node.js)

    node.js 下载地址:https://nodejs.org/en/download/下载 64-bit 下载包下载完成双击安装: