funboost 49.1__tar.gz → 49.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of funboost might be problematic. Click here for more details.

Files changed (344) hide show
  1. {funboost-49.1/funboost.egg-info → funboost-49.3}/PKG-INFO +86 -19
  2. {funboost-49.1 → funboost-49.3}/README.md +84 -24
  3. {funboost-49.1 → funboost-49.3}/funboost/__init__.py +1 -1
  4. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/async_helper.py +20 -1
  5. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/async_pool_executor.py +42 -60
  6. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/backup/async_pool_executor_back.py +4 -2
  7. {funboost-49.1 → funboost-49.3}/funboost/constant.py +27 -3
  8. {funboost-49.1 → funboost-49.3}/funboost/consumers/base_consumer.py +11 -6
  9. {funboost-49.1 → funboost-49.3}/funboost/consumers/rocketmq_consumer.py +2 -2
  10. {funboost-49.1 → funboost-49.3}/funboost/core/active_cousumer_info_getter.py +51 -4
  11. funboost-49.3/funboost/function_result_web/__pycache__/app.cpython-313.pyc +0 -0
  12. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
  13. funboost-49.3/funboost/function_result_web/__pycache__/functions.cpython-313.pyc +0 -0
  14. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/app.py +16 -3
  15. funboost-49.3/funboost/function_result_web/app_debug_start.py +10 -0
  16. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/queue_op.html +149 -192
  17. {funboost-49.1 → funboost-49.3}/funboost/publishers/faststream_publisher.py +3 -2
  18. {funboost-49.1 → funboost-49.3}/funboost/publishers/redis_publisher_priority.py +1 -1
  19. {funboost-49.1 → funboost-49.3}/funboost/set_frame_config.py +2 -1
  20. {funboost-49.1 → funboost-49.3}/funboost/timing_job/apscheduler_use_redis_store.py +8 -1
  21. {funboost-49.1 → funboost-49.3}/funboost/timing_job/timing_job_base.py +20 -7
  22. {funboost-49.1 → funboost-49.3}/funboost/timing_job/timing_push.py +7 -5
  23. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -6
  24. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -6
  25. {funboost-49.1 → funboost-49.3/funboost.egg-info}/PKG-INFO +86 -19
  26. {funboost-49.1 → funboost-49.3}/funboost.egg-info/SOURCES.txt +2 -0
  27. {funboost-49.1 → funboost-49.3}/setup.py +4 -3
  28. funboost-49.1/funboost/function_result_web/app_debug_start.py +0 -6
  29. {funboost-49.1 → funboost-49.3}/LICENSE +0 -0
  30. {funboost-49.1 → funboost-49.3}/MANIFEST.in +0 -0
  31. {funboost-49.1 → funboost-49.3}/funboost/__init__old.py +0 -0
  32. {funboost-49.1 → funboost-49.3}/funboost/__main__.py +0 -0
  33. {funboost-49.1 → funboost-49.3}/funboost/assist/__init__.py +0 -0
  34. {funboost-49.1 → funboost-49.3}/funboost/assist/celery_helper.py +0 -0
  35. {funboost-49.1 → funboost-49.3}/funboost/assist/dramatiq_helper.py +0 -0
  36. {funboost-49.1 → funboost-49.3}/funboost/assist/faststream_helper.py +0 -0
  37. {funboost-49.1 → funboost-49.3}/funboost/assist/huey_helper.py +0 -0
  38. {funboost-49.1 → funboost-49.3}/funboost/assist/rocketry_helper.py +0 -0
  39. {funboost-49.1 → funboost-49.3}/funboost/assist/rq_helper.py +0 -0
  40. {funboost-49.1 → funboost-49.3}/funboost/assist/rq_windows_worker.py +0 -0
  41. {funboost-49.1 → funboost-49.3}/funboost/assist/taskiq_helper.py +0 -0
  42. {funboost-49.1 → funboost-49.3}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
  43. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/__init__.py +0 -0
  44. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/backup/__init__.py +0 -0
  45. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
  46. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
  47. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/backup/grok_async_pool.py +0 -0
  48. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/base_pool_type.py +0 -0
  49. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
  50. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
  51. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
  52. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
  53. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
  54. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
  55. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
  56. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
  57. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
  58. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
  59. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/pool_commons.py +0 -0
  60. {funboost-49.1 → funboost-49.3}/funboost/concurrent_pool/single_thread_executor.py +0 -0
  61. {funboost-49.1 → funboost-49.3}/funboost/consumers/__init__.py +0 -0
  62. {funboost-49.1 → funboost-49.3}/funboost/consumers/celery_consumer.py +0 -0
  63. {funboost-49.1 → funboost-49.3}/funboost/consumers/confirm_mixin.py +0 -0
  64. {funboost-49.1 → funboost-49.3}/funboost/consumers/dramatiq_consumer.py +0 -0
  65. {funboost-49.1 → funboost-49.3}/funboost/consumers/empty_consumer.py +0 -0
  66. {funboost-49.1 → funboost-49.3}/funboost/consumers/faststream_consumer.py +0 -0
  67. {funboost-49.1 → funboost-49.3}/funboost/consumers/http_consumer.py +0 -0
  68. {funboost-49.1 → funboost-49.3}/funboost/consumers/http_consumer000.py +0 -0
  69. {funboost-49.1 → funboost-49.3}/funboost/consumers/httpsqs_consumer.py +0 -0
  70. {funboost-49.1 → funboost-49.3}/funboost/consumers/huey_consumer.py +0 -0
  71. {funboost-49.1 → funboost-49.3}/funboost/consumers/kafka_consumer.py +0 -0
  72. {funboost-49.1 → funboost-49.3}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
  73. {funboost-49.1 → funboost-49.3}/funboost/consumers/kombu_consumer.py +0 -0
  74. {funboost-49.1 → funboost-49.3}/funboost/consumers/local_python_queue_consumer.py +0 -0
  75. {funboost-49.1 → funboost-49.3}/funboost/consumers/memory_deque_consumer.py +0 -0
  76. {funboost-49.1 → funboost-49.3}/funboost/consumers/mongomq_consumer.py +0 -0
  77. {funboost-49.1 → funboost-49.3}/funboost/consumers/mqtt_consumer.py +0 -0
  78. {funboost-49.1 → funboost-49.3}/funboost/consumers/nameko_consumer.py +0 -0
  79. {funboost-49.1 → funboost-49.3}/funboost/consumers/nats_consumer.py +0 -0
  80. {funboost-49.1 → funboost-49.3}/funboost/consumers/nsq_consumer.py +0 -0
  81. {funboost-49.1 → funboost-49.3}/funboost/consumers/peewee_conusmer.py +0 -0
  82. {funboost-49.1 → funboost-49.3}/funboost/consumers/persist_queue_consumer.py +0 -0
  83. {funboost-49.1 → funboost-49.3}/funboost/consumers/pulsar_consumer.py +0 -0
  84. {funboost-49.1 → funboost-49.3}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
  85. {funboost-49.1 → funboost-49.3}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
  86. {funboost-49.1 → funboost-49.3}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
  87. {funboost-49.1 → funboost-49.3}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
  88. {funboost-49.1 → funboost-49.3}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
  89. {funboost-49.1 → funboost-49.3}/funboost/consumers/redis_consumer.py +0 -0
  90. {funboost-49.1 → funboost-49.3}/funboost/consumers/redis_consumer_ack_able.py +0 -0
  91. {funboost-49.1 → funboost-49.3}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
  92. {funboost-49.1 → funboost-49.3}/funboost/consumers/redis_consumer_priority.py +0 -0
  93. {funboost-49.1 → funboost-49.3}/funboost/consumers/redis_consumer_simple.py +0 -0
  94. {funboost-49.1 → funboost-49.3}/funboost/consumers/redis_filter.py +0 -0
  95. {funboost-49.1 → funboost-49.3}/funboost/consumers/redis_pubsub_consumer.py +0 -0
  96. {funboost-49.1 → funboost-49.3}/funboost/consumers/redis_stream_consumer.py +0 -0
  97. {funboost-49.1 → funboost-49.3}/funboost/consumers/rq_consumer.py +0 -0
  98. {funboost-49.1 → funboost-49.3}/funboost/consumers/sqlachemy_consumer.py +0 -0
  99. {funboost-49.1 → funboost-49.3}/funboost/consumers/tcp_consumer.py +0 -0
  100. {funboost-49.1 → funboost-49.3}/funboost/consumers/txt_file_consumer.py +0 -0
  101. {funboost-49.1 → funboost-49.3}/funboost/consumers/udp_consumer.py +0 -0
  102. {funboost-49.1 → funboost-49.3}/funboost/consumers/zeromq_consumer.py +0 -0
  103. {funboost-49.1 → funboost-49.3}/funboost/contrib/__init__.py +0 -0
  104. {funboost-49.1 → funboost-49.3}/funboost/contrib/api_publish_msg.py +0 -0
  105. {funboost-49.1 → funboost-49.3}/funboost/contrib/django_db_deco.py +0 -0
  106. {funboost-49.1 → funboost-49.3}/funboost/contrib/queue2queue.py +0 -0
  107. {funboost-49.1 → funboost-49.3}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
  108. {funboost-49.1 → funboost-49.3}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
  109. {funboost-49.1 → funboost-49.3}/funboost/core/__init__.py +0 -0
  110. {funboost-49.1 → funboost-49.3}/funboost/core/booster.py +0 -0
  111. {funboost-49.1 → funboost-49.3}/funboost/core/cli/__init__.py +0 -0
  112. {funboost-49.1 → funboost-49.3}/funboost/core/cli/discovery_boosters.py +0 -0
  113. {funboost-49.1 → funboost-49.3}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
  114. {funboost-49.1 → funboost-49.3}/funboost/core/cli/funboost_fire.py +0 -0
  115. {funboost-49.1 → funboost-49.3}/funboost/core/current_task.py +0 -0
  116. {funboost-49.1 → funboost-49.3}/funboost/core/exceptions.py +0 -0
  117. {funboost-49.1 → funboost-49.3}/funboost/core/fabric_deploy_helper.py +0 -0
  118. {funboost-49.1 → funboost-49.3}/funboost/core/funboost_config_getter.py +0 -0
  119. {funboost-49.1 → funboost-49.3}/funboost/core/funboost_time.py +0 -0
  120. {funboost-49.1 → funboost-49.3}/funboost/core/func_params_model.py +0 -0
  121. {funboost-49.1 → funboost-49.3}/funboost/core/function_result_status_config.py +0 -0
  122. {funboost-49.1 → funboost-49.3}/funboost/core/function_result_status_saver.py +0 -0
  123. {funboost-49.1 → funboost-49.3}/funboost/core/helper_funs.py +0 -0
  124. {funboost-49.1 → funboost-49.3}/funboost/core/kill_remote_task.py +0 -0
  125. {funboost-49.1 → funboost-49.3}/funboost/core/lazy_impoter.py +0 -0
  126. {funboost-49.1 → funboost-49.3}/funboost/core/loggers.py +0 -0
  127. {funboost-49.1 → funboost-49.3}/funboost/core/msg_result_getter.py +0 -0
  128. {funboost-49.1 → funboost-49.3}/funboost/core/muliti_process_enhance.py +0 -0
  129. {funboost-49.1 → funboost-49.3}/funboost/core/serialization.py +0 -0
  130. {funboost-49.1 → funboost-49.3}/funboost/core/task_id_logger.py +0 -0
  131. {funboost-49.1 → funboost-49.3}/funboost/factories/__init__.py +0 -0
  132. {funboost-49.1 → funboost-49.3}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
  133. {funboost-49.1 → funboost-49.3}/funboost/factories/consumer_factory.py +0 -0
  134. {funboost-49.1 → funboost-49.3}/funboost/factories/publisher_factotry.py +0 -0
  135. {funboost-49.1 → funboost-49.3}/funboost/funboost_config_deafult.py +0 -0
  136. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/__pycache__/app.cpython-39.pyc +0 -0
  137. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  138. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
  139. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/functions.py +0 -0
  140. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/assets/css/custom.css +0 -0
  141. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
  142. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
  143. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/assets/js/custom.js +0 -0
  144. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
  145. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css/content_page_style.css +0 -0
  146. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css/style.css +0 -0
  147. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css +0 -0
  148. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/css/font-awesome.min.css +0 -0
  149. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/FontAwesome.otf +0 -0
  150. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.eot +0 -0
  151. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.svg +0 -0
  152. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf +0 -0
  153. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff +0 -0
  154. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2 +0 -0
  155. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/select2/4.0.13/css/select2.min.css +0 -0
  156. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator.min.css +0 -0
  157. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator_bootstrap3.min.css +0 -0
  158. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/css/bootstrap.min.css +0 -0
  159. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.eot +0 -0
  160. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.svg +0 -0
  161. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.ttf +0 -0
  162. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff +0 -0
  163. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff2 +0 -0
  164. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/images/bg.jpg +0 -0
  165. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/images/favicon.ico +0 -0
  166. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/images/password.png +0 -0
  167. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/images/tick.png +0 -0
  168. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/images/user.png +0 -0
  169. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/js/bootstrap-datetimepicker.min.js +0 -0
  170. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/js/echarts.min.js +0 -0
  171. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/js/form-memory.js +0 -0
  172. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
  173. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/js/moment-with-locales.min.js +0 -0
  174. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/js/select2.min.js +0 -0
  175. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/js_cdn/bootstrap/3.3.7/js/bootstrap.min.js +0 -0
  176. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/js_cdn/chart.js +0 -0
  177. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/static/js_cdn/tabulator-tables@5.5.0/dist/js/tabulator.min.js +0 -0
  178. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/about.html +0 -0
  179. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/conusme_speed.html +0 -0
  180. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/fun_result_table.html +0 -0
  181. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/index.html +0 -0
  182. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/index_backup.html +0 -0
  183. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/login.html +0 -0
  184. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/rpc_call.html +0 -0
  185. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/running_consumer_by_ip.html +0 -0
  186. {funboost-49.1 → funboost-49.3}/funboost/function_result_web/templates/running_consumer_by_queue_name.html +0 -0
  187. {funboost-49.1 → funboost-49.3}/funboost/publishers/__init__.py +0 -0
  188. {funboost-49.1 → funboost-49.3}/funboost/publishers/base_publisher.py +0 -0
  189. {funboost-49.1 → funboost-49.3}/funboost/publishers/celery_publisher.py +0 -0
  190. {funboost-49.1 → funboost-49.3}/funboost/publishers/celery_publisher000.py +0 -0
  191. {funboost-49.1 → funboost-49.3}/funboost/publishers/confluent_kafka_publisher.py +0 -0
  192. {funboost-49.1 → funboost-49.3}/funboost/publishers/dramatiq_publisher.py +0 -0
  193. {funboost-49.1 → funboost-49.3}/funboost/publishers/empty_publisher.py +0 -0
  194. {funboost-49.1 → funboost-49.3}/funboost/publishers/http_publisher.py +0 -0
  195. {funboost-49.1 → funboost-49.3}/funboost/publishers/httpsqs_publisher.py +0 -0
  196. {funboost-49.1 → funboost-49.3}/funboost/publishers/huey_publisher.py +0 -0
  197. {funboost-49.1 → funboost-49.3}/funboost/publishers/kafka_publisher.py +0 -0
  198. {funboost-49.1 → funboost-49.3}/funboost/publishers/kombu_publisher.py +0 -0
  199. {funboost-49.1 → funboost-49.3}/funboost/publishers/local_python_queue_publisher.py +0 -0
  200. {funboost-49.1 → funboost-49.3}/funboost/publishers/meomory_deque_publisher.py +0 -0
  201. {funboost-49.1 → funboost-49.3}/funboost/publishers/mongomq_publisher.py +0 -0
  202. {funboost-49.1 → funboost-49.3}/funboost/publishers/mqtt_publisher.py +0 -0
  203. {funboost-49.1 → funboost-49.3}/funboost/publishers/nameko_publisher.py +0 -0
  204. {funboost-49.1 → funboost-49.3}/funboost/publishers/nats_publisher.py +0 -0
  205. {funboost-49.1 → funboost-49.3}/funboost/publishers/nsq_publisher.py +0 -0
  206. {funboost-49.1 → funboost-49.3}/funboost/publishers/peewee_publisher.py +0 -0
  207. {funboost-49.1 → funboost-49.3}/funboost/publishers/persist_queue_publisher.py +0 -0
  208. {funboost-49.1 → funboost-49.3}/funboost/publishers/pulsar_publisher.py +0 -0
  209. {funboost-49.1 → funboost-49.3}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
  210. {funboost-49.1 → funboost-49.3}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
  211. {funboost-49.1 → funboost-49.3}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
  212. {funboost-49.1 → funboost-49.3}/funboost/publishers/redis_publisher.py +0 -0
  213. {funboost-49.1 → funboost-49.3}/funboost/publishers/redis_publisher_lpush.py +0 -0
  214. {funboost-49.1 → funboost-49.3}/funboost/publishers/redis_publisher_simple.py +0 -0
  215. {funboost-49.1 → funboost-49.3}/funboost/publishers/redis_pubsub_publisher.py +0 -0
  216. {funboost-49.1 → funboost-49.3}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
  217. {funboost-49.1 → funboost-49.3}/funboost/publishers/redis_stream_publisher.py +0 -0
  218. {funboost-49.1 → funboost-49.3}/funboost/publishers/rocketmq_publisher.py +0 -0
  219. {funboost-49.1 → funboost-49.3}/funboost/publishers/rq_publisher.py +0 -0
  220. {funboost-49.1 → funboost-49.3}/funboost/publishers/sqla_queue_publisher.py +0 -0
  221. {funboost-49.1 → funboost-49.3}/funboost/publishers/tcp_publisher.py +0 -0
  222. {funboost-49.1 → funboost-49.3}/funboost/publishers/txt_file_publisher.py +0 -0
  223. {funboost-49.1 → funboost-49.3}/funboost/publishers/udp_publisher.py +0 -0
  224. {funboost-49.1 → funboost-49.3}/funboost/publishers/zeromq_publisher.py +0 -0
  225. {funboost-49.1 → funboost-49.3}/funboost/queues/__init__.py +0 -0
  226. {funboost-49.1 → funboost-49.3}/funboost/queues/memory_queues_map.py +0 -0
  227. {funboost-49.1 → funboost-49.3}/funboost/queues/peewee_queue.py +0 -0
  228. {funboost-49.1 → funboost-49.3}/funboost/queues/sqla_queue.py +0 -0
  229. {funboost-49.1 → funboost-49.3}/funboost/timing_job/__init__.py +0 -0
  230. {funboost-49.1 → funboost-49.3}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
  231. {funboost-49.1 → funboost-49.3}/funboost/utils/__init__.py +0 -0
  232. {funboost-49.1 → funboost-49.3}/funboost/utils/apscheduler_monkey.py +0 -0
  233. {funboost-49.1 → funboost-49.3}/funboost/utils/block_exit.py +0 -0
  234. {funboost-49.1 → funboost-49.3}/funboost/utils/bulk_operation.py +0 -0
  235. {funboost-49.1 → funboost-49.3}/funboost/utils/class_utils.py +0 -0
  236. {funboost-49.1 → funboost-49.3}/funboost/utils/class_utils2.py +0 -0
  237. {funboost-49.1 → funboost-49.3}/funboost/utils/ctrl_c_end.py +0 -0
  238. {funboost-49.1 → funboost-49.3}/funboost/utils/custom_pysnooper.py +0 -0
  239. {funboost-49.1 → funboost-49.3}/funboost/utils/decorators.py +0 -0
  240. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages/__init__.py +0 -0
  241. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
  242. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
  243. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
  244. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
  245. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
  246. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
  247. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
  248. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
  249. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-313.pyc +0 -0
  250. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
  251. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  252. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
  253. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-313.pyc +0 -0
  254. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
  255. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  256. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
  257. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
  258. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
  259. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
  260. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
  261. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
  262. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
  263. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
  264. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
  265. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
  266. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  267. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
  268. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
  269. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
  270. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
  271. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
  272. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
  273. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
  274. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
  275. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
  276. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
  277. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
  278. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
  279. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
  280. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
  281. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
  282. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
  283. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
  284. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
  285. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
  286. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
  287. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
  288. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
  289. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
  290. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
  291. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
  292. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
  293. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
  294. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
  295. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
  296. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
  297. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
  298. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
  299. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
  300. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
  301. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
  302. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
  303. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
  304. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
  305. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
  306. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
  307. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
  308. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
  309. {funboost-49.1 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
  310. {funboost-49.1 → funboost-49.3}/funboost/utils/develop_log.py +0 -0
  311. {funboost-49.1 → funboost-49.3}/funboost/utils/expire_lock.py +0 -0
  312. {funboost-49.1 → funboost-49.3}/funboost/utils/func_timeout/StoppableThread.py +0 -0
  313. {funboost-49.1 → funboost-49.3}/funboost/utils/func_timeout/__init__.py +0 -0
  314. {funboost-49.1 → funboost-49.3}/funboost/utils/func_timeout/dafunc.py +0 -0
  315. {funboost-49.1 → funboost-49.3}/funboost/utils/func_timeout/exceptions.py +0 -0
  316. {funboost-49.1 → funboost-49.3}/funboost/utils/func_timeout/py2_raise.py +0 -0
  317. {funboost-49.1 → funboost-49.3}/funboost/utils/func_timeout/py3_raise.py +0 -0
  318. {funboost-49.1 → funboost-49.3}/funboost/utils/json_helper.py +0 -0
  319. {funboost-49.1 → funboost-49.3}/funboost/utils/mongo_util.py +0 -0
  320. {funboost-49.1 → funboost-49.3}/funboost/utils/monkey_color_log.py +0 -0
  321. {funboost-49.1 → funboost-49.3}/funboost/utils/monkey_patches.py +0 -0
  322. {funboost-49.1 → funboost-49.3}/funboost/utils/mqtt_util.py +0 -0
  323. {funboost-49.1 → funboost-49.3}/funboost/utils/paramiko_util.py +0 -0
  324. {funboost-49.1 → funboost-49.3}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
  325. {funboost-49.1 → funboost-49.3}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
  326. {funboost-49.1 → funboost-49.3}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
  327. {funboost-49.1 → funboost-49.3}/funboost/utils/pysnooper_ydf/utils.py +0 -0
  328. {funboost-49.1 → funboost-49.3}/funboost/utils/pysnooper_ydf/variables.py +0 -0
  329. {funboost-49.1 → funboost-49.3}/funboost/utils/rabbitmq_factory.py +0 -0
  330. {funboost-49.1 → funboost-49.3}/funboost/utils/redis_manager.py +0 -0
  331. {funboost-49.1 → funboost-49.3}/funboost/utils/redis_manager_old.py +0 -0
  332. {funboost-49.1 → funboost-49.3}/funboost/utils/resource_monitoring.py +0 -0
  333. {funboost-49.1 → funboost-49.3}/funboost/utils/restart_python.py +0 -0
  334. {funboost-49.1 → funboost-49.3}/funboost/utils/simple_data_class.py +0 -0
  335. {funboost-49.1 → funboost-49.3}/funboost/utils/str_utils.py +0 -0
  336. {funboost-49.1 → funboost-49.3}/funboost/utils/time_util.py +0 -0
  337. {funboost-49.1 → funboost-49.3}/funboost/utils/times/__init__.py +0 -0
  338. {funboost-49.1 → funboost-49.3}/funboost/utils/times/version.py +0 -0
  339. {funboost-49.1 → funboost-49.3}/funboost/utils/un_strict_json_dumps.py +0 -0
  340. {funboost-49.1 → funboost-49.3}/funboost.egg-info/dependency_links.txt +0 -0
  341. {funboost-49.1 → funboost-49.3}/funboost.egg-info/entry_points.txt +0 -0
  342. {funboost-49.1 → funboost-49.3}/funboost.egg-info/requires.txt +4 -4
  343. {funboost-49.1 → funboost-49.3}/funboost.egg-info/top_level.txt +0 -0
  344. {funboost-49.1 → funboost-49.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 49.1
3
+ Version: 49.3
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,funboost web manager 方便查看和管理消费函数;99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -23,6 +23,7 @@ Classifier: Programming Language :: Python :: 3.9
23
23
  Classifier: Programming Language :: Python :: 3.10
24
24
  Classifier: Programming Language :: Python :: 3.11
25
25
  Classifier: Programming Language :: Python :: 3.12
26
+ Classifier: Programming Language :: Python :: 3.13
26
27
  Classifier: Programming Language :: Python :: 3 :: Only
27
28
  Classifier: Topic :: Software Development :: Libraries
28
29
  Description-Content-Type: text/markdown
@@ -72,8 +73,10 @@ Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”
72
73
  框架对代码没有入侵,可以加到任意已有项目而对项目python文件目录结构0要求,
73
74
  不像 celery django scrapy 这样的框架,要从一开始就开始规划好项目目录结构,如果不想用框架了,
74
75
  或者想改变使用其他框架框架,那么已经所写的代码组织形式就几乎成了废物,需要大改特改.
75
- 但是funboost完全不会这样,加上或去掉@boost装饰器,对你的项目影响为0,用户照常使用,
76
+ 但是funboost完全不会这样,就算是加上或去掉@boost装饰器,对你的项目影响为0,用户照常使用,
76
77
  所以用户可以对任意项目,任意时候,引入使用funboost或者去掉使用funboost,代码组织形式不需要发生变化.
78
+ (即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数有@boost装饰器对函数自身的直接调用运行没有任何影响,
79
+ 用户照样可以直接例如 fun(x,y)是直接运行函数 , fun.push(x,y) 才是发送到消息队列)
77
80
 
78
81
  通过funboost web manager 管理系统,支持全面 查看 监控 管理 funboost的任务消费。
79
82
  </pre>
@@ -485,26 +488,32 @@ if __name__ == "__main__":
485
488
 
486
489
 
487
490
 
488
- ## 1.3.2 funboost丝滑连续启动多个函数消费
491
+ ## 1.3.2 funboost集中演示一个功能更多的综合例子
489
492
 
490
493
  ```python
491
494
 
495
+
492
496
  """
493
- 此代码
494
- 1.演示支持多个函数消费队列的无阻塞启动(consume不会阻塞主线程)
495
- 2.演示支持在一个消费函数内部向任意队列发布新任务,实现多级任务链
496
- 代码结构清晰,扩展性极强
497
+ 一个展示更全面 funboost 用法的例子
498
+ 包含了
499
+ 1.继承BoosterParams,为了每个装饰器少写入参
500
+ 2.rpc获取结果
501
+ 3.连续丝滑启动多个消费函数
502
+ 4.定时任务
497
503
  """
498
- from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum
504
+ from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum,ApsJobAdder
499
505
  import time
500
506
 
501
507
  class MyBoosterParams(BoosterParams): # 自定义的参数类,继承BoosterParams,用于减少每个消费函数装饰器的重复相同入参个数
502
- broker_kind: str = BrokerEnum.MEMORY_QUEUE
508
+ broker_kind: str = BrokerEnum.REDIS_ACK_ABLE
503
509
  max_retry_times: int = 3
504
510
  concurrent_mode: str = ConcurrentModeEnum.THREADING
505
511
 
506
512
 
507
- @boost(MyBoosterParams(queue_name='s1_queue', qps=1, ))
513
+ @boost(MyBoosterParams(queue_name='s1_queue', qps=1,
514
+ # do_task_filtering=True, # 可开启任务过滤,防止重复入参消费。
515
+ is_using_rpc_mode=True, # 开启rpc模式,支持rpc获取结果
516
+ ))
508
517
  def step1(a:int,b:int):
509
518
  print(f'a={a},b={b}')
510
519
  time.sleep(0.7)
@@ -513,20 +522,75 @@ def step1(a:int,b:int):
513
522
  return a+b
514
523
 
515
524
 
516
- @boost(MyBoosterParams(queue_name='s2_queue', qps=3, ))
517
- def step2(c:int,d:int,e:int):
525
+ @boost(MyBoosterParams(queue_name='s2_queue', qps=3,
526
+ max_retry_times=5,# 可以在此覆盖MyBoosterParams中的默认值,例如为step2单独设置最大重试次数为5
527
+ ))
528
+ def step2(c:int,d:int,e:int=666):
518
529
  time.sleep(3)
519
530
  print(f'c={c},d={d},e={e}')
520
531
  return c* d * e
521
532
 
522
533
 
523
534
  if __name__ == '__main__':
524
- for i in range(100):
525
- step1.push(i,i*2) # 向 step1函数的队列发送消息。
535
+ step1.clear() # 清空队列
536
+ step2.clear() # 清空队列
537
+
526
538
  step1.consume() # 调用.consume是非阻塞的启动消费,是在单独的子线程中循环拉取消息的。
527
539
  # 有的人还担心阻塞而手动使用 threading.Thread(target=step1.consume).start() 来启动消费,这是完全多此一举的错误写法。
528
- step2.consume() # 所以可以连续无阻塞丝滑的启动多个函数消费。
529
- ctrl_c_recv()
540
+ step2.consume() # 所以可以在当前主线程连续无阻塞丝滑的启动多个函数消费。
541
+ step2.multi_process_consume(3) # 这是多进程叠加了多线程消费,另外开启了3个进程,叠加了默认的线程并发。
542
+
543
+ async_result = step1.push(100,b=200)
544
+ print('step1的rpc结果是:',async_result.result) # rpc阻塞等待消step1的费结果返回
545
+
546
+ for i in range(100):
547
+ step1.push(i,i*2) # 向 step1函数的队列发送消息,入参和手动调用函数那样很相似。
548
+ step1.publish ({'a':i,'b':i*2},task_id=f'task_{i}') # publish 第一个入参是字典,比push能传递更多funboost的辅助参数,类似celery的apply_async和delay的关系。一个简单,一个复杂但强大。
549
+
550
+
551
+
552
+ """
553
+ 1.funboost 使用 ApsJobAdder.add_push_job来添加定时任务,不是add_job。
554
+ 2.funboost是轻度封装的知名apscheduler框架,所以定时任务的语法和apscheduler是一样的,没有自己发明语法和入参
555
+ 用户需要苦学apscheduler教程,一切定时都是要学apscheduler知识,定时和funboost知识关系很小。
556
+ 3.funboost的定时任务目的是定时推送消息到消息队列中,而不是定时直接在当前程序中执行某个消费函数。
557
+
558
+ 下面是三种方式添加定时任务,这些定时方式都是知名apscheduler包的定时方式,和funboost没关系。
559
+ """
560
+ # 方式1:指定日期执行一次
561
+ ApsJobAdder(step2,
562
+ job_store_kind='redis', # 使用reids作为 apscheduler的 jobstrores
563
+ is_auto_start=True, # 添加任务,并同时顺便启动了定时器 执行了apscheduler对象.start()
564
+ ).add_push_job(
565
+ trigger='date',
566
+ run_date='2025-06-30 16:25:40',
567
+ args=(7, 8,9),
568
+ id='date_job1',
569
+ replace_existing=True,
570
+ )
571
+
572
+ # 方式2:固定间隔执行
573
+ ApsJobAdder(step2, job_store_kind='redis').add_push_job(
574
+ trigger='interval',
575
+ seconds=30,
576
+ args=(4, 6,10),
577
+ id='interval_job1',
578
+ replace_existing=True,
579
+ )
580
+
581
+ # 方式3:使用cron表达式定时执行
582
+ ApsJobAdder(step2, job_store_kind='redis').add_push_job(
583
+ trigger='cron',
584
+ day_of_week='*',
585
+ hour=23,
586
+ minute=49,
587
+ second=50,
588
+ kwargs={"c": 50, "d": 60,"e":70},
589
+ replace_existing=True,
590
+ id='cron_job1')
591
+
592
+ ctrl_c_recv() # 用于阻塞代码,阻止主线程退出,使主线程永久运行。 相当于 你在代码最末尾,加了个 while 1:time.sleep(10),使主线程永不结束。apscheduler background定时器守护线程需要这样保持定时器不退出。
593
+
530
594
 
531
595
  ```
532
596
 
@@ -594,14 +658,17 @@ python比其他语言更需要分布式函数调度框架来执行函数,有
594
658
 
595
659
  ## 1.6 funboost支持支持celery框架整体作为funboost的broker (2023.4新增)
596
660
  ```
597
- 见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api,核心的消费调度和发布和定时功能,都是由celery框架来完成,funboost框架的发布和调度代码不实际起作用。
661
+ 见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api
662
+ 核心的消费调度和发布和定时功能,都是由celery框架来完成,funboost框架的发布和调度代码不实际起作用。
598
663
  用户操作funboost的api,语法和使用其他消息队列中间件类型一样,funboost自动化操作celery。
599
664
 
600
665
  用户无需操作celery本身,无需敲击celery难记的命令行启动消费、定时、flower;
601
666
  用户无需小心翼翼纠结亲自使用celery时候怎么规划目录结构 文件夹命名 需要怎么在配置写include 写task_routes,
602
- 完全不存在需要固定的celery目录结构,不需要手动配置懵逼的任务路由,不需要配置每个函数怎么使用不同的队列名字,funboost自动搞定这些。
667
+ 完全不存在需要固定的celery目录结构,不需要手动配置懵逼的任务路由,
668
+ 不需要配置每个函数怎么使用不同的队列名字,funboost自动搞定这些。
603
669
 
604
- 用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind,远远的暴击亲自使用无法ide下代码补全的celery框架的语法。
670
+ 用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind,
671
+ 远远的暴击亲自使用无法ide下代码补全的celery框架的语法。
605
672
  ```
606
673
 
607
674
  ```
@@ -1,9 +1,3 @@
1
- ---
2
- noteId: "67d3a8f045e411f0ab0bf59d9f569ed4"
3
- tags: []
4
-
5
- ---
6
-
7
1
 
8
2
 
9
3
  # 1.python万能分布式函数调度框架简funboost简介
@@ -45,8 +39,10 @@ Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”
45
39
  框架对代码没有入侵,可以加到任意已有项目而对项目python文件目录结构0要求,
46
40
  不像 celery django scrapy 这样的框架,要从一开始就开始规划好项目目录结构,如果不想用框架了,
47
41
  或者想改变使用其他框架框架,那么已经所写的代码组织形式就几乎成了废物,需要大改特改.
48
- 但是funboost完全不会这样,加上或去掉@boost装饰器,对你的项目影响为0,用户照常使用,
42
+ 但是funboost完全不会这样,就算是加上或去掉@boost装饰器,对你的项目影响为0,用户照常使用,
49
43
  所以用户可以对任意项目,任意时候,引入使用funboost或者去掉使用funboost,代码组织形式不需要发生变化.
44
+ (即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数有@boost装饰器对函数自身的直接调用运行没有任何影响,
45
+ 用户照样可以直接例如 fun(x,y)是直接运行函数 , fun.push(x,y) 才是发送到消息队列)
50
46
 
51
47
  通过funboost web manager 管理系统,支持全面 查看 监控 管理 funboost的任务消费。
52
48
  </pre>
@@ -458,26 +454,32 @@ if __name__ == "__main__":
458
454
 
459
455
 
460
456
 
461
- ## 1.3.2 funboost丝滑连续启动多个函数消费
457
+ ## 1.3.2 funboost集中演示一个功能更多的综合例子
462
458
 
463
459
  ```python
464
460
 
461
+
465
462
  """
466
- 此代码
467
- 1.演示支持多个函数消费队列的无阻塞启动(consume不会阻塞主线程)
468
- 2.演示支持在一个消费函数内部向任意队列发布新任务,实现多级任务链
469
- 代码结构清晰,扩展性极强
463
+ 一个展示更全面 funboost 用法的例子
464
+ 包含了
465
+ 1.继承BoosterParams,为了每个装饰器少写入参
466
+ 2.rpc获取结果
467
+ 3.连续丝滑启动多个消费函数
468
+ 4.定时任务
470
469
  """
471
- from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum
470
+ from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum,ApsJobAdder
472
471
  import time
473
472
 
474
473
  class MyBoosterParams(BoosterParams): # 自定义的参数类,继承BoosterParams,用于减少每个消费函数装饰器的重复相同入参个数
475
- broker_kind: str = BrokerEnum.MEMORY_QUEUE
474
+ broker_kind: str = BrokerEnum.REDIS_ACK_ABLE
476
475
  max_retry_times: int = 3
477
476
  concurrent_mode: str = ConcurrentModeEnum.THREADING
478
477
 
479
478
 
480
- @boost(MyBoosterParams(queue_name='s1_queue', qps=1, ))
479
+ @boost(MyBoosterParams(queue_name='s1_queue', qps=1,
480
+ # do_task_filtering=True, # 可开启任务过滤,防止重复入参消费。
481
+ is_using_rpc_mode=True, # 开启rpc模式,支持rpc获取结果
482
+ ))
481
483
  def step1(a:int,b:int):
482
484
  print(f'a={a},b={b}')
483
485
  time.sleep(0.7)
@@ -486,20 +488,75 @@ def step1(a:int,b:int):
486
488
  return a+b
487
489
 
488
490
 
489
- @boost(MyBoosterParams(queue_name='s2_queue', qps=3, ))
490
- def step2(c:int,d:int,e:int):
491
+ @boost(MyBoosterParams(queue_name='s2_queue', qps=3,
492
+ max_retry_times=5,# 可以在此覆盖MyBoosterParams中的默认值,例如为step2单独设置最大重试次数为5
493
+ ))
494
+ def step2(c:int,d:int,e:int=666):
491
495
  time.sleep(3)
492
496
  print(f'c={c},d={d},e={e}')
493
497
  return c* d * e
494
498
 
495
499
 
496
500
  if __name__ == '__main__':
497
- for i in range(100):
498
- step1.push(i,i*2) # 向 step1函数的队列发送消息。
501
+ step1.clear() # 清空队列
502
+ step2.clear() # 清空队列
503
+
499
504
  step1.consume() # 调用.consume是非阻塞的启动消费,是在单独的子线程中循环拉取消息的。
500
505
  # 有的人还担心阻塞而手动使用 threading.Thread(target=step1.consume).start() 来启动消费,这是完全多此一举的错误写法。
501
- step2.consume() # 所以可以连续无阻塞丝滑的启动多个函数消费。
502
- ctrl_c_recv()
506
+ step2.consume() # 所以可以在当前主线程连续无阻塞丝滑的启动多个函数消费。
507
+ step2.multi_process_consume(3) # 这是多进程叠加了多线程消费,另外开启了3个进程,叠加了默认的线程并发。
508
+
509
+ async_result = step1.push(100,b=200)
510
+ print('step1的rpc结果是:',async_result.result) # rpc阻塞等待消step1的费结果返回
511
+
512
+ for i in range(100):
513
+ step1.push(i,i*2) # 向 step1函数的队列发送消息,入参和手动调用函数那样很相似。
514
+ step1.publish ({'a':i,'b':i*2},task_id=f'task_{i}') # publish 第一个入参是字典,比push能传递更多funboost的辅助参数,类似celery的apply_async和delay的关系。一个简单,一个复杂但强大。
515
+
516
+
517
+
518
+ """
519
+ 1.funboost 使用 ApsJobAdder.add_push_job来添加定时任务,不是add_job。
520
+ 2.funboost是轻度封装的知名apscheduler框架,所以定时任务的语法和apscheduler是一样的,没有自己发明语法和入参
521
+ 用户需要苦学apscheduler教程,一切定时都是要学apscheduler知识,定时和funboost知识关系很小。
522
+ 3.funboost的定时任务目的是定时推送消息到消息队列中,而不是定时直接在当前程序中执行某个消费函数。
523
+
524
+ 下面是三种方式添加定时任务,这些定时方式都是知名apscheduler包的定时方式,和funboost没关系。
525
+ """
526
+ # 方式1:指定日期执行一次
527
+ ApsJobAdder(step2,
528
+ job_store_kind='redis', # 使用reids作为 apscheduler的 jobstrores
529
+ is_auto_start=True, # 添加任务,并同时顺便启动了定时器 执行了apscheduler对象.start()
530
+ ).add_push_job(
531
+ trigger='date',
532
+ run_date='2025-06-30 16:25:40',
533
+ args=(7, 8,9),
534
+ id='date_job1',
535
+ replace_existing=True,
536
+ )
537
+
538
+ # 方式2:固定间隔执行
539
+ ApsJobAdder(step2, job_store_kind='redis').add_push_job(
540
+ trigger='interval',
541
+ seconds=30,
542
+ args=(4, 6,10),
543
+ id='interval_job1',
544
+ replace_existing=True,
545
+ )
546
+
547
+ # 方式3:使用cron表达式定时执行
548
+ ApsJobAdder(step2, job_store_kind='redis').add_push_job(
549
+ trigger='cron',
550
+ day_of_week='*',
551
+ hour=23,
552
+ minute=49,
553
+ second=50,
554
+ kwargs={"c": 50, "d": 60,"e":70},
555
+ replace_existing=True,
556
+ id='cron_job1')
557
+
558
+ ctrl_c_recv() # 用于阻塞代码,阻止主线程退出,使主线程永久运行。 相当于 你在代码最末尾,加了个 while 1:time.sleep(10),使主线程永不结束。apscheduler background定时器守护线程需要这样保持定时器不退出。
559
+
503
560
 
504
561
  ```
505
562
 
@@ -567,14 +624,17 @@ python比其他语言更需要分布式函数调度框架来执行函数,有
567
624
 
568
625
  ## 1.6 funboost支持支持celery框架整体作为funboost的broker (2023.4新增)
569
626
  ```
570
- 见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api,核心的消费调度和发布和定时功能,都是由celery框架来完成,funboost框架的发布和调度代码不实际起作用。
627
+ 见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api
628
+ 核心的消费调度和发布和定时功能,都是由celery框架来完成,funboost框架的发布和调度代码不实际起作用。
571
629
  用户操作funboost的api,语法和使用其他消息队列中间件类型一样,funboost自动化操作celery。
572
630
 
573
631
  用户无需操作celery本身,无需敲击celery难记的命令行启动消费、定时、flower;
574
632
  用户无需小心翼翼纠结亲自使用celery时候怎么规划目录结构 文件夹命名 需要怎么在配置写include 写task_routes,
575
- 完全不存在需要固定的celery目录结构,不需要手动配置懵逼的任务路由,不需要配置每个函数怎么使用不同的队列名字,funboost自动搞定这些。
633
+ 完全不存在需要固定的celery目录结构,不需要手动配置懵逼的任务路由,
634
+ 不需要配置每个函数怎么使用不同的队列名字,funboost自动搞定这些。
576
635
 
577
- 用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind,远远的暴击亲自使用无法ide下代码补全的celery框架的语法。
636
+ 用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind,
637
+ 远远的暴击亲自使用无法ide下代码补全的celery框架的语法。
578
638
  ```
579
639
 
580
640
  ```
@@ -13,7 +13,7 @@ set_frame_config这个模块的 use_config_form_funboost_config_module() 是核
13
13
  这段注释说明和使用的用户无关,只和框架开发人员有关.
14
14
  '''
15
15
 
16
- __version__ = "49.1"
16
+ __version__ = "49.3"
17
17
 
18
18
  from funboost.set_frame_config import show_frame_config
19
19
 
@@ -9,6 +9,21 @@ async_executor_default = ThreadPoolExecutorShrinkAble(500)
9
9
  # async_executor_default = FlexibleThreadPool(50) # 这个不支持future特性
10
10
 
11
11
 
12
+ def get_or_create_event_loop():
13
+ try:
14
+ # Python 3.7+
15
+ return asyncio.get_running_loop()
16
+ except RuntimeError:
17
+ # 没有正在运行的 loop
18
+ try:
19
+ # Python 3.6~3.9:get_event_loop 会自动创建
20
+ return asyncio.get_event_loop()
21
+ except RuntimeError:
22
+ # Python 3.10+:get_event_loop 不再自动创建
23
+ loop = asyncio.new_event_loop()
24
+ asyncio.set_event_loop(loop)
25
+ return loop
26
+
12
27
  async def simple_run_in_executor(f, *args, async_executor: Executor = None, async_loop=None, **kwargs):
13
28
  """
14
29
  一个很强的函数,使任意同步同步函数f,转化成asyncio异步api语法,
@@ -31,13 +46,17 @@ async def simple_run_in_executor(f, *args, async_executor: Executor = None, asyn
31
46
  :param kwargs:f函数的关键字方式入参
32
47
  :return:
33
48
  """
34
- loopx = async_loop or asyncio.get_event_loop()
49
+ loopx = async_loop or get_or_create_event_loop()
35
50
  async_executorx = async_executor or async_executor_default
36
51
  # print(id(loopx))
37
52
  result = await loopx.run_in_executor(async_executorx, partial(f, *args, **kwargs))
38
53
  return result
39
54
 
40
55
 
56
+
57
+
58
+
59
+
41
60
  if __name__ == '__main__':
42
61
  import time
43
62
  import requests
@@ -48,7 +48,7 @@ if sys.platform == "darwin": # mac 上会出错
48
48
  import selectors
49
49
  selectors.DefaultSelector = selectors.PollSelector
50
50
 
51
- class AsyncPoolExecutorLtPy310(FunboostFileLoggerMixin,FunboostBaseConcurrentPool):
51
+ class AsyncPoolExecutor(FunboostFileLoggerMixin,FunboostBaseConcurrentPool):
52
52
  """
53
53
  使api和线程池一样,最好的性能做法是submit也弄成 async def,生产和消费在同一个线程同一个loop一起运行,但会对调用链路的兼容性产生破坏,从而调用方式不兼容线程池。
54
54
  """
@@ -62,28 +62,31 @@ class AsyncPoolExecutorLtPy310(FunboostFileLoggerMixin,FunboostBaseConcurrentPoo
62
62
  self._size = size
63
63
  self.loop = loop or asyncio.new_event_loop()
64
64
  asyncio.set_event_loop(self.loop)
65
- self._sem = asyncio.Semaphore(self._size, loop=self.loop)
66
- self._queue = asyncio.Queue(maxsize=size, loop=self.loop)
67
- self._lock = threading.Lock()
68
- t = Thread(target=self._start_loop_in_new_thread, daemon=True)
65
+ self._diff_init()
66
+ # self._lock = threading.Lock()
67
+ t = Thread(target=self._start_loop_in_new_thread, daemon=False)
69
68
  # t.setDaemon(True) # 设置守护线程是为了有机会触发atexit,使程序自动结束,不用手动调用shutdown
70
69
  t.start()
71
- self._can_be_closed_flag = False
72
- atexit.register(self.shutdown)
73
-
74
- self._event = threading.Event()
75
- # print(self._event.is_set())
76
- self._event.set()
77
-
78
- def submit000(self, func, *args, **kwargs):
79
- # 这个性能比下面的采用 run_coroutine_threadsafe + result返回快了3倍多。
80
- with self._lock:
81
- while 1:
82
- if not self._queue.full():
83
- self.loop.call_soon_threadsafe(self._queue.put_nowait, (func, args, kwargs))
84
- break
85
- else:
86
- time.sleep(0.01)
70
+
71
+
72
+ # def submit000(self, func, *args, **kwargs):
73
+ # # 这个性能比下面的采用 run_coroutine_threadsafe + result返回快了3倍多。
74
+ # with self._lock:
75
+ # while 1:
76
+ # if not self._queue.full():
77
+ # self.loop.call_soon_threadsafe(self._queue.put_nowait, (func, args, kwargs))
78
+ # break
79
+ # else:
80
+ # time.sleep(0.01)
81
+
82
+ def _diff_init(self):
83
+ if sys.version_info.minor < 10:
84
+ # self._sem = asyncio.Semaphore(self._size, loop=self.loop)
85
+ self._queue = asyncio.Queue(maxsize=self._size, loop=self.loop)
86
+ else:
87
+ # self._sem = asyncio.Semaphore(self._size) # python3.10后,很多类和方法都删除了loop传参
88
+ self._queue = asyncio.Queue(maxsize=self._size)
89
+
87
90
 
88
91
  def submit(self, func, *args, **kwargs):
89
92
  future = asyncio.run_coroutine_threadsafe(self._produce(func, *args, **kwargs), self.loop) # 这个 run_coroutine_threadsafe 方法也有缺点,消耗的性能巨大。
@@ -102,7 +105,7 @@ class AsyncPoolExecutorLtPy310(FunboostFileLoggerMixin,FunboostBaseConcurrentPoo
102
105
  try:
103
106
  await func(*args, **kwargs)
104
107
  except BaseException as e:
105
- traceback.print_exc()
108
+ self.logger.exception(f'func:{func}, args:{args}, kwargs:{kwargs} exc_type:{type(e)} traceback_exc:{traceback.format_exc()}')
106
109
  # self._queue.task_done()
107
110
 
108
111
  async def __run(self):
@@ -114,54 +117,33 @@ class AsyncPoolExecutorLtPy310(FunboostFileLoggerMixin,FunboostBaseConcurrentPoo
114
117
  # self._loop.run_forever()
115
118
 
116
119
  # asyncio.set_event_loop(self.loop)
117
- self.loop.run_until_complete(asyncio.wait([self._consume() for _ in range(self._size)], loop=self.loop))
118
- self._can_be_closed_flag = True
120
+ # self.loop.run_until_complete(asyncio.wait([self._consume() for _ in range(self._size)], loop=self.loop))
121
+ # self._can_be_closed_flag = True
122
+ [self.loop.create_task(self._consume()) for _ in range(self._size)]
123
+ try:
124
+ self.loop.run_forever()
125
+ except Exception as e:
126
+ self.logger.warning(f'{e}') # 如果多个线程使用一个loop,不能重复启动loop,否则会报错。
119
127
 
120
- def shutdown(self):
121
- if self.loop.is_running(): # 这个可能是atregster触发,也可能是用户手动调用,需要判断一下,不能关闭两次。
122
- for i in range(self._size):
123
- self.submit(f'stop{i}', )
124
- while not self._can_be_closed_flag:
125
- time.sleep(0.1)
126
- self.loop.stop()
127
- self.loop.close()
128
- print('关闭循环')
129
128
 
130
129
 
130
+ # def shutdown(self):
131
+ # if self.loop.is_running(): # 这个可能是atregster触发,也可能是用户手动调用,需要判断一下,不能关闭两次。
132
+ # for i in range(self._size):
133
+ # self.submit(f'stop{i}', )
134
+ # while not self._can_be_closed_flag:
135
+ # time.sleep(0.1)
136
+ # self.loop.stop()
137
+ # self.loop.close()
138
+ # print('关闭循环')
139
+
131
140
 
132
- class AsyncPoolExecutorGtPy310(AsyncPoolExecutorLtPy310):
133
- # noinspection PyMissingConstructor
134
- def __init__(self, size, loop=None):
135
- """
136
141
 
137
- :param size: 同时并发运行的协程任务数量。
138
- :param loop:
139
- """
140
- self._size = size
141
- self.loop = loop or asyncio.new_event_loop()
142
- self._sem = asyncio.Semaphore(self._size, )
143
- self._queue = asyncio.Queue(maxsize=size, )
144
- self._lock = threading.Lock()
145
- t = Thread(target=self._start_loop_in_new_thread, daemon=True)
146
- # t.setDaemon(True) # 设置守护线程是为了有机会触发atexit,使程序自动结束,不用手动调用shutdown
147
- t.start()
148
- self._can_be_closed_flag = False
149
- atexit.register(self.shutdown)
150
142
 
151
- self._event = threading.Event()
152
- # print(self._event.is_set())
153
- self._event.set()
154
143
 
155
- def _start_loop_in_new_thread(self, ):
156
- # self._loop.run_until_complete(self.__run()) # 这种也可以。
157
- # self._loop.run_forever()
158
144
 
159
- # asyncio.set_event_loop(self.loop)
160
- self.loop.run_until_complete(asyncio.wait([self.loop.create_task(self._consume()) for _ in range(self._size)], ))
161
- self._can_be_closed_flag = True
162
145
 
163
146
 
164
- AsyncPoolExecutor = AsyncPoolExecutorLtPy310 if sys.version_info.minor < 10 else AsyncPoolExecutorGtPy310
165
147
 
166
148
 
167
149
 
@@ -4,7 +4,9 @@ import threading
4
4
  import time
5
5
  import traceback
6
6
  from threading import Thread
7
- import nb_log # noqa
7
+ import nb_log
8
+
9
+ from funboost.concurrent_pool.async_helper import get_or_create_event_loop # noqa
8
10
 
9
11
  # if os.name == 'posix':
10
12
  # import uvloop
@@ -215,7 +217,7 @@ class AsyncProducerConsumer:
215
217
  task.cancel()
216
218
 
217
219
  def start_run(self):
218
- loop = asyncio.get_event_loop()
220
+ loop = get_or_create_event_loop()
219
221
  loop.run_until_complete(self.__run())
220
222
  # loop.close()
221
223
 
@@ -1,9 +1,9 @@
1
1
  # coding= utf-8
2
- from calendar import c
2
+
3
3
 
4
4
 
5
5
  class BrokerEnum:
6
- EMPTY = 'empty' # 空的实现,需要搭配 boost入参的 consumer_override_cls 和 publisher_override_cls使用,或者被继承。
6
+ EMPTY = 'EMPTY' # 空的实现,需要搭配 boost入参的 consumer_override_cls 和 publisher_override_cls使用,或者被继承。
7
7
 
8
8
  RABBITMQ_AMQPSTORM = 'RABBITMQ_AMQPSTORM' # 使用 amqpstorm 包操作rabbitmq 作为 分布式消息队列,支持消费确认.强烈推荐这个作为funboost中间件。
9
9
  RABBITMQ = RABBITMQ_AMQPSTORM
@@ -73,7 +73,7 @@ class BrokerEnum:
73
73
  PEEWEE = 'PEEWEE' # peewee包操作mysql,使用表模拟消息队列
74
74
 
75
75
  CELERY = 'CELERY' # funboost支持celery框架来发布和消费任务,由celery框架来调度执行任务,但是写法简单远远暴击用户亲自使用celery的麻烦程度,
76
- # 用户永无无需关心和操作Celery对象实例,无需关心celery的task_routes和include配置,funboost来自动化设置这些celery配置。
76
+ # 用户永无无需关心和操作Celery对象实例,无需关心celery的task_routes和includes配置,funboost来自动化设置这些celery配置。
77
77
 
78
78
  DRAMATIQ = 'DRAMATIQ' # funboost使用 dramatiq 框架作为消息队列,dramatiq类似celery也是任务队列框架。用户使用funboost api来操作dramatiq核心调度。
79
79
 
@@ -108,7 +108,10 @@ class ConstStrForClassMethod:
108
108
  OBJ_INIT_PARAMS = 'obj_init_params'
109
109
  CLS_MODULE = 'cls_module'
110
110
  CLS_FILE = 'cls_file'
111
+
112
+
111
113
  class RedisKeys:
114
+
112
115
  REDIS_KEY_PAUSE_FLAG = 'funboost_pause_flag'
113
116
  REDIS_KEY_STOP_FLAG = 'funboost_stop_flag'
114
117
  QUEUE__MSG_COUNT_MAP = 'funboost_queue__msg_count_map'
@@ -117,10 +120,17 @@ class RedisKeys:
117
120
  FUNBOOST_QUEUE__RUN_FAIL_COUNT_MAP = 'funboost_queue__run_fail_count_map'
118
121
  FUNBOOST_ALL_QUEUE_NAMES = 'funboost_all_queue_names'
119
122
  FUNBOOST_ALL_IPS = 'funboost_all_ips'
123
+ FUNBOOST_LAST_GET_QUEUE_PARAMS_AND_ACTIVE_CONSUMERS_AND_REPORT__UUID_TS = 'funboost_last_get_queue_params_and_active_consumers_and_report__uuid_ts'
124
+
120
125
 
121
126
  FUNBOOST_HEARTBEAT_QUEUE__DICT_PREFIX = 'funboost_hearbeat_queue__dict:'
122
127
  FUNBOOST_HEARTBEAT_SERVER__DICT_PREFIX = 'funboost_hearbeat_server__dict:'
123
128
 
129
+
130
+ @staticmethod
131
+ def gen_funboost_apscheduler_redis_lock_key_by_queue_name(queue_name):
132
+ return f'funboost.BackgroundSchedulerProcessJobsWithinRedisLock:{queue_name}'
133
+
124
134
  @staticmethod
125
135
  def gen_funboost_hearbeat_queue__dict_key_by_queue_name(queue_name):
126
136
  return f'{RedisKeys.FUNBOOST_HEARTBEAT_QUEUE__DICT_PREFIX}{queue_name}'
@@ -128,3 +138,17 @@ class RedisKeys:
128
138
  @staticmethod
129
139
  def gen_funboost_hearbeat_server__dict_key_by_ip(ip):
130
140
  return f'{RedisKeys.FUNBOOST_HEARTBEAT_SERVER__DICT_PREFIX}{ip}'
141
+
142
+ @staticmethod
143
+ def gen_funboost_queue_time_series_data_key_by_queue_name(queue_name):
144
+ return f'funboost_queue_time_series_data:{queue_name}'
145
+
146
+ @staticmethod
147
+ def gen_funboost_redis_apscheduler_jobs_key_by_queue_name(queue_name):
148
+ jobs_key=f'funboost.apscheduler.jobs:{queue_name}'
149
+ return jobs_key
150
+
151
+ @staticmethod
152
+ def gen_funboost_redis_apscheduler_run_times_key_by_queue_name(queue_name):
153
+ run_times_key=f'funboost.apscheduler.run_times:{queue_name}'
154
+ return run_times_key