funboost 47.9__tar.gz → 48.1__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 (316) hide show
  1. {funboost-47.9/funboost.egg-info → funboost-48.1}/PKG-INFO +7 -92
  2. {funboost-47.9 → funboost-48.1}/README.md +5 -3
  3. {funboost-47.9 → funboost-48.1}/funboost/__init__.py +3 -3
  4. {funboost-47.9 → funboost-48.1}/funboost/assist/celery_helper.py +1 -1
  5. {funboost-47.9 → funboost-48.1}/funboost/constant.py +7 -0
  6. {funboost-47.9 → funboost-48.1}/funboost/consumers/base_consumer.py +132 -75
  7. {funboost-47.9 → funboost-48.1}/funboost/consumers/redis_consumer_ack_able.py +1 -1
  8. {funboost-47.9 → funboost-48.1}/funboost/core/active_cousumer_info_getter.py +60 -0
  9. {funboost-47.9 → funboost-48.1}/funboost/core/current_task.py +37 -0
  10. {funboost-47.9 → funboost-48.1}/funboost/core/func_params_model.py +2 -2
  11. {funboost-47.9 → funboost-48.1}/funboost/core/function_result_status_saver.py +1 -1
  12. funboost-48.1/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  13. funboost-48.1/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
  14. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/app.py +104 -7
  15. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/functions.py +17 -4
  16. funboost-48.1/funboost/function_result_web/static/css/content_page_style.css +39 -0
  17. funboost-48.1/funboost/function_result_web/static/images/favicon.ico +0 -0
  18. funboost-48.1/funboost/function_result_web/static/js/bootstrap-datetimepicker.min.js +2 -0
  19. funboost-48.1/funboost/function_result_web/static/js/echarts.min.js +32478 -0
  20. funboost-48.1/funboost/function_result_web/static/js/moment-with-locales.min.js +1 -0
  21. funboost-48.1/funboost/function_result_web/static/js/select2.min.js +2 -0
  22. funboost-48.1/funboost/function_result_web/templates/about.html +67 -0
  23. funboost-48.1/funboost/function_result_web/templates/conusme_speed.html +217 -0
  24. funboost-48.1/funboost/function_result_web/templates/fun_result_table.html +433 -0
  25. funboost-48.1/funboost/function_result_web/templates/index.html +233 -0
  26. funboost-47.9/funboost/function_result_web/templates/index.html → funboost-48.1/funboost/function_result_web/templates/index_backup.html +94 -81
  27. funboost-48.1/funboost/function_result_web/templates/index_/344/270/215/345/217/257/346/212/230/345/217/240.html +153 -0
  28. funboost-48.1/funboost/function_result_web/templates/queue_op.html +490 -0
  29. funboost-48.1/funboost/function_result_web/templates/running_consumer_by_ip.html +220 -0
  30. funboost-48.1/funboost/function_result_web/templates/running_consumer_by_queue_name.html +216 -0
  31. funboost-48.1/funboost/timing_job/__init__.py +6 -0
  32. {funboost-47.9 → funboost-48.1}/funboost/timing_job/apscheduler_use_redis_store.py +6 -1
  33. funboost-47.9/funboost/timing_job/__init__.py → funboost-48.1/funboost/timing_job/timing_job_base.py +4 -12
  34. funboost-48.1/funboost/timing_job/timing_push.py +136 -0
  35. {funboost-47.9 → funboost-48.1}/funboost/utils/ctrl_c_end.py +1 -1
  36. {funboost-47.9 → funboost-48.1/funboost.egg-info}/PKG-INFO +7 -92
  37. {funboost-47.9 → funboost-48.1}/funboost.egg-info/SOURCES.txt +17 -0
  38. {funboost-47.9 → funboost-48.1}/funboost.egg-info/requires.txt +2 -2
  39. {funboost-47.9 → funboost-48.1}/setup.py +2 -2
  40. funboost-47.9/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  41. {funboost-47.9 → funboost-48.1}/LICENSE +0 -0
  42. {funboost-47.9 → funboost-48.1}/MANIFEST.in +0 -0
  43. {funboost-47.9 → funboost-48.1}/funboost/__init__old.py +0 -0
  44. {funboost-47.9 → funboost-48.1}/funboost/__main__.py +0 -0
  45. {funboost-47.9 → funboost-48.1}/funboost/assist/__init__.py +0 -0
  46. {funboost-47.9 → funboost-48.1}/funboost/assist/dramatiq_helper.py +0 -0
  47. {funboost-47.9 → funboost-48.1}/funboost/assist/faststream_helper.py +0 -0
  48. {funboost-47.9 → funboost-48.1}/funboost/assist/huey_helper.py +0 -0
  49. {funboost-47.9 → funboost-48.1}/funboost/assist/rocketry_helper.py +0 -0
  50. {funboost-47.9 → funboost-48.1}/funboost/assist/rq_helper.py +0 -0
  51. {funboost-47.9 → funboost-48.1}/funboost/assist/rq_windows_worker.py +0 -0
  52. {funboost-47.9 → funboost-48.1}/funboost/assist/taskiq_helper.py +0 -0
  53. {funboost-47.9 → funboost-48.1}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
  54. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/__init__.py +0 -0
  55. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/async_helper.py +0 -0
  56. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/async_pool_executor.py +0 -0
  57. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/backup/__init__.py +0 -0
  58. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
  59. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
  60. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
  61. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/base_pool_type.py +0 -0
  62. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
  63. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
  64. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
  65. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
  66. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
  67. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
  68. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
  69. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
  70. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
  71. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
  72. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/pool_commons.py +0 -0
  73. {funboost-47.9 → funboost-48.1}/funboost/concurrent_pool/single_thread_executor.py +0 -0
  74. {funboost-47.9 → funboost-48.1}/funboost/consumers/__init__.py +0 -0
  75. {funboost-47.9 → funboost-48.1}/funboost/consumers/celery_consumer.py +0 -0
  76. {funboost-47.9 → funboost-48.1}/funboost/consumers/confirm_mixin.py +0 -0
  77. {funboost-47.9 → funboost-48.1}/funboost/consumers/dramatiq_consumer.py +0 -0
  78. {funboost-47.9 → funboost-48.1}/funboost/consumers/empty_consumer.py +0 -0
  79. {funboost-47.9 → funboost-48.1}/funboost/consumers/faststream_consumer.py +0 -0
  80. {funboost-47.9 → funboost-48.1}/funboost/consumers/http_consumer.py +0 -0
  81. {funboost-47.9 → funboost-48.1}/funboost/consumers/http_consumer000.py +0 -0
  82. {funboost-47.9 → funboost-48.1}/funboost/consumers/httpsqs_consumer.py +0 -0
  83. {funboost-47.9 → funboost-48.1}/funboost/consumers/huey_consumer.py +0 -0
  84. {funboost-47.9 → funboost-48.1}/funboost/consumers/kafka_consumer.py +0 -0
  85. {funboost-47.9 → funboost-48.1}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
  86. {funboost-47.9 → funboost-48.1}/funboost/consumers/kombu_consumer.py +0 -0
  87. {funboost-47.9 → funboost-48.1}/funboost/consumers/local_python_queue_consumer.py +0 -0
  88. {funboost-47.9 → funboost-48.1}/funboost/consumers/memory_deque_consumer.py +0 -0
  89. {funboost-47.9 → funboost-48.1}/funboost/consumers/mongomq_consumer.py +0 -0
  90. {funboost-47.9 → funboost-48.1}/funboost/consumers/mqtt_consumer.py +0 -0
  91. {funboost-47.9 → funboost-48.1}/funboost/consumers/nameko_consumer.py +0 -0
  92. {funboost-47.9 → funboost-48.1}/funboost/consumers/nats_consumer.py +0 -0
  93. {funboost-47.9 → funboost-48.1}/funboost/consumers/nsq_consumer.py +0 -0
  94. {funboost-47.9 → funboost-48.1}/funboost/consumers/peewee_conusmer.py +0 -0
  95. {funboost-47.9 → funboost-48.1}/funboost/consumers/persist_queue_consumer.py +0 -0
  96. {funboost-47.9 → funboost-48.1}/funboost/consumers/pulsar_consumer.py +0 -0
  97. {funboost-47.9 → funboost-48.1}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
  98. {funboost-47.9 → funboost-48.1}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
  99. {funboost-47.9 → funboost-48.1}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
  100. {funboost-47.9 → funboost-48.1}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
  101. {funboost-47.9 → funboost-48.1}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
  102. {funboost-47.9 → funboost-48.1}/funboost/consumers/redis_consumer.py +0 -0
  103. {funboost-47.9 → funboost-48.1}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
  104. {funboost-47.9 → funboost-48.1}/funboost/consumers/redis_consumer_priority.py +0 -0
  105. {funboost-47.9 → funboost-48.1}/funboost/consumers/redis_consumer_simple.py +0 -0
  106. {funboost-47.9 → funboost-48.1}/funboost/consumers/redis_filter.py +0 -0
  107. {funboost-47.9 → funboost-48.1}/funboost/consumers/redis_pubsub_consumer.py +0 -0
  108. {funboost-47.9 → funboost-48.1}/funboost/consumers/redis_stream_consumer.py +0 -0
  109. {funboost-47.9 → funboost-48.1}/funboost/consumers/rocketmq_consumer.py +0 -0
  110. {funboost-47.9 → funboost-48.1}/funboost/consumers/rq_consumer.py +0 -0
  111. {funboost-47.9 → funboost-48.1}/funboost/consumers/sqlachemy_consumer.py +0 -0
  112. {funboost-47.9 → funboost-48.1}/funboost/consumers/tcp_consumer.py +0 -0
  113. {funboost-47.9 → funboost-48.1}/funboost/consumers/txt_file_consumer.py +0 -0
  114. {funboost-47.9 → funboost-48.1}/funboost/consumers/udp_consumer.py +0 -0
  115. {funboost-47.9 → funboost-48.1}/funboost/consumers/zeromq_consumer.py +0 -0
  116. {funboost-47.9 → funboost-48.1}/funboost/contrib/__init__.py +0 -0
  117. {funboost-47.9 → funboost-48.1}/funboost/contrib/api_publish_msg.py +0 -0
  118. {funboost-47.9 → funboost-48.1}/funboost/contrib/django_db_deco.py +0 -0
  119. {funboost-47.9 → funboost-48.1}/funboost/contrib/queue2queue.py +0 -0
  120. {funboost-47.9 → funboost-48.1}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
  121. {funboost-47.9 → funboost-48.1}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
  122. {funboost-47.9 → funboost-48.1}/funboost/core/__init__.py +0 -0
  123. {funboost-47.9 → funboost-48.1}/funboost/core/booster.py +0 -0
  124. {funboost-47.9 → funboost-48.1}/funboost/core/cli/__init__.py +0 -0
  125. {funboost-47.9 → funboost-48.1}/funboost/core/cli/discovery_boosters.py +0 -0
  126. {funboost-47.9 → funboost-48.1}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
  127. {funboost-47.9 → funboost-48.1}/funboost/core/cli/funboost_fire.py +0 -0
  128. {funboost-47.9 → funboost-48.1}/funboost/core/exceptions.py +0 -0
  129. {funboost-47.9 → funboost-48.1}/funboost/core/fabric_deploy_helper.py +0 -0
  130. {funboost-47.9 → funboost-48.1}/funboost/core/funboost_config_getter.py +0 -0
  131. {funboost-47.9 → funboost-48.1}/funboost/core/funboost_time.py +0 -0
  132. {funboost-47.9 → funboost-48.1}/funboost/core/function_result_status_config.py +0 -0
  133. {funboost-47.9 → funboost-48.1}/funboost/core/helper_funs.py +0 -0
  134. {funboost-47.9 → funboost-48.1}/funboost/core/kill_remote_task.py +0 -0
  135. {funboost-47.9 → funboost-48.1}/funboost/core/lazy_impoter.py +0 -0
  136. {funboost-47.9 → funboost-48.1}/funboost/core/loggers.py +0 -0
  137. {funboost-47.9 → funboost-48.1}/funboost/core/msg_result_getter.py +0 -0
  138. {funboost-47.9 → funboost-48.1}/funboost/core/muliti_process_enhance.py +0 -0
  139. {funboost-47.9 → funboost-48.1}/funboost/core/serialization.py +0 -0
  140. {funboost-47.9 → funboost-48.1}/funboost/core/task_id_logger.py +0 -0
  141. {funboost-47.9 → funboost-48.1}/funboost/factories/__init__.py +0 -0
  142. {funboost-47.9 → funboost-48.1}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
  143. {funboost-47.9 → funboost-48.1}/funboost/factories/consumer_factory.py +0 -0
  144. {funboost-47.9 → funboost-48.1}/funboost/factories/publisher_factotry.py +0 -0
  145. {funboost-47.9 → funboost-48.1}/funboost/funboost_config_deafult.py +0 -0
  146. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
  147. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/assets/css/custom.css +0 -0
  148. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
  149. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
  150. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/assets/js/custom.js +0 -0
  151. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
  152. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/css/style.css +0 -0
  153. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/images/bg.jpg +0 -0
  154. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/images/password.png +0 -0
  155. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/images/tick.png +0 -0
  156. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/images/user.png +0 -0
  157. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
  158. {funboost-47.9 → funboost-48.1}/funboost/function_result_web/templates/login.html +0 -0
  159. {funboost-47.9 → funboost-48.1}/funboost/publishers/__init__.py +0 -0
  160. {funboost-47.9 → funboost-48.1}/funboost/publishers/base_publisher.py +0 -0
  161. {funboost-47.9 → funboost-48.1}/funboost/publishers/celery_publisher.py +0 -0
  162. {funboost-47.9 → funboost-48.1}/funboost/publishers/celery_publisher000.py +0 -0
  163. {funboost-47.9 → funboost-48.1}/funboost/publishers/confluent_kafka_publisher.py +0 -0
  164. {funboost-47.9 → funboost-48.1}/funboost/publishers/dramatiq_publisher.py +0 -0
  165. {funboost-47.9 → funboost-48.1}/funboost/publishers/empty_publisher.py +0 -0
  166. {funboost-47.9 → funboost-48.1}/funboost/publishers/faststream_publisher.py +0 -0
  167. {funboost-47.9 → funboost-48.1}/funboost/publishers/http_publisher.py +0 -0
  168. {funboost-47.9 → funboost-48.1}/funboost/publishers/httpsqs_publisher.py +0 -0
  169. {funboost-47.9 → funboost-48.1}/funboost/publishers/huey_publisher.py +0 -0
  170. {funboost-47.9 → funboost-48.1}/funboost/publishers/kafka_publisher.py +0 -0
  171. {funboost-47.9 → funboost-48.1}/funboost/publishers/kombu_publisher.py +0 -0
  172. {funboost-47.9 → funboost-48.1}/funboost/publishers/local_python_queue_publisher.py +0 -0
  173. {funboost-47.9 → funboost-48.1}/funboost/publishers/meomory_deque_publisher.py +0 -0
  174. {funboost-47.9 → funboost-48.1}/funboost/publishers/mongomq_publisher.py +0 -0
  175. {funboost-47.9 → funboost-48.1}/funboost/publishers/mqtt_publisher.py +0 -0
  176. {funboost-47.9 → funboost-48.1}/funboost/publishers/nameko_publisher.py +0 -0
  177. {funboost-47.9 → funboost-48.1}/funboost/publishers/nats_publisher.py +0 -0
  178. {funboost-47.9 → funboost-48.1}/funboost/publishers/nsq_publisher.py +0 -0
  179. {funboost-47.9 → funboost-48.1}/funboost/publishers/peewee_publisher.py +0 -0
  180. {funboost-47.9 → funboost-48.1}/funboost/publishers/persist_queue_publisher.py +0 -0
  181. {funboost-47.9 → funboost-48.1}/funboost/publishers/pulsar_publisher.py +0 -0
  182. {funboost-47.9 → funboost-48.1}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
  183. {funboost-47.9 → funboost-48.1}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
  184. {funboost-47.9 → funboost-48.1}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
  185. {funboost-47.9 → funboost-48.1}/funboost/publishers/redis_publisher.py +0 -0
  186. {funboost-47.9 → funboost-48.1}/funboost/publishers/redis_publisher_lpush.py +0 -0
  187. {funboost-47.9 → funboost-48.1}/funboost/publishers/redis_publisher_priority.py +0 -0
  188. {funboost-47.9 → funboost-48.1}/funboost/publishers/redis_publisher_simple.py +0 -0
  189. {funboost-47.9 → funboost-48.1}/funboost/publishers/redis_pubsub_publisher.py +0 -0
  190. {funboost-47.9 → funboost-48.1}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
  191. {funboost-47.9 → funboost-48.1}/funboost/publishers/redis_stream_publisher.py +0 -0
  192. {funboost-47.9 → funboost-48.1}/funboost/publishers/rocketmq_publisher.py +0 -0
  193. {funboost-47.9 → funboost-48.1}/funboost/publishers/rq_publisher.py +0 -0
  194. {funboost-47.9 → funboost-48.1}/funboost/publishers/sqla_queue_publisher.py +0 -0
  195. {funboost-47.9 → funboost-48.1}/funboost/publishers/tcp_publisher.py +0 -0
  196. {funboost-47.9 → funboost-48.1}/funboost/publishers/txt_file_publisher.py +0 -0
  197. {funboost-47.9 → funboost-48.1}/funboost/publishers/udp_publisher.py +0 -0
  198. {funboost-47.9 → funboost-48.1}/funboost/publishers/zeromq_publisher.py +0 -0
  199. {funboost-47.9 → funboost-48.1}/funboost/queues/__init__.py +0 -0
  200. {funboost-47.9 → funboost-48.1}/funboost/queues/memory_queues_map.py +0 -0
  201. {funboost-47.9 → funboost-48.1}/funboost/queues/peewee_queue.py +0 -0
  202. {funboost-47.9 → funboost-48.1}/funboost/queues/sqla_queue.py +0 -0
  203. {funboost-47.9 → funboost-48.1}/funboost/set_frame_config.py +0 -0
  204. {funboost-47.9 → funboost-48.1}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
  205. {funboost-47.9 → funboost-48.1}/funboost/utils/__init__.py +0 -0
  206. {funboost-47.9 → funboost-48.1}/funboost/utils/apscheduler_monkey.py +0 -0
  207. {funboost-47.9 → funboost-48.1}/funboost/utils/block_exit.py +0 -0
  208. {funboost-47.9 → funboost-48.1}/funboost/utils/bulk_operation.py +0 -0
  209. {funboost-47.9 → funboost-48.1}/funboost/utils/class_utils.py +0 -0
  210. {funboost-47.9 → funboost-48.1}/funboost/utils/class_utils2.py +0 -0
  211. {funboost-47.9 → funboost-48.1}/funboost/utils/custom_pysnooper.py +0 -0
  212. {funboost-47.9 → funboost-48.1}/funboost/utils/decorators.py +0 -0
  213. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages/__init__.py +0 -0
  214. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
  215. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
  216. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
  217. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
  218. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
  219. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
  220. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
  221. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
  222. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
  223. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  224. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
  225. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
  226. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  227. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
  228. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
  229. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
  230. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
  231. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
  232. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
  233. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
  234. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
  235. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
  236. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
  237. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  238. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
  239. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
  240. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
  241. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
  242. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
  243. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
  244. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
  245. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
  246. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
  247. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
  248. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
  249. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
  250. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
  251. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
  252. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
  253. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
  254. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
  255. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
  256. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
  257. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
  258. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
  259. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
  260. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
  261. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
  262. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
  263. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
  264. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
  265. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
  266. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
  267. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
  268. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
  269. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
  270. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
  271. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
  272. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
  273. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
  274. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
  275. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
  276. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
  277. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
  278. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
  279. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
  280. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
  281. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
  282. {funboost-47.9 → funboost-48.1}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
  283. {funboost-47.9 → funboost-48.1}/funboost/utils/develop_log.py +0 -0
  284. {funboost-47.9 → funboost-48.1}/funboost/utils/expire_lock.py +0 -0
  285. {funboost-47.9 → funboost-48.1}/funboost/utils/func_timeout/StoppableThread.py +0 -0
  286. {funboost-47.9 → funboost-48.1}/funboost/utils/func_timeout/__init__.py +0 -0
  287. {funboost-47.9 → funboost-48.1}/funboost/utils/func_timeout/dafunc.py +0 -0
  288. {funboost-47.9 → funboost-48.1}/funboost/utils/func_timeout/exceptions.py +0 -0
  289. {funboost-47.9 → funboost-48.1}/funboost/utils/func_timeout/py2_raise.py +0 -0
  290. {funboost-47.9 → funboost-48.1}/funboost/utils/func_timeout/py3_raise.py +0 -0
  291. {funboost-47.9 → funboost-48.1}/funboost/utils/json_helper.py +0 -0
  292. {funboost-47.9 → funboost-48.1}/funboost/utils/mongo_util.py +0 -0
  293. {funboost-47.9 → funboost-48.1}/funboost/utils/monkey_color_log.py +0 -0
  294. {funboost-47.9 → funboost-48.1}/funboost/utils/monkey_patches.py +0 -0
  295. {funboost-47.9 → funboost-48.1}/funboost/utils/mqtt_util.py +0 -0
  296. {funboost-47.9 → funboost-48.1}/funboost/utils/paramiko_util.py +0 -0
  297. {funboost-47.9 → funboost-48.1}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
  298. {funboost-47.9 → funboost-48.1}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
  299. {funboost-47.9 → funboost-48.1}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
  300. {funboost-47.9 → funboost-48.1}/funboost/utils/pysnooper_ydf/utils.py +0 -0
  301. {funboost-47.9 → funboost-48.1}/funboost/utils/pysnooper_ydf/variables.py +0 -0
  302. {funboost-47.9 → funboost-48.1}/funboost/utils/rabbitmq_factory.py +0 -0
  303. {funboost-47.9 → funboost-48.1}/funboost/utils/redis_manager.py +0 -0
  304. {funboost-47.9 → funboost-48.1}/funboost/utils/redis_manager_old.py +0 -0
  305. {funboost-47.9 → funboost-48.1}/funboost/utils/resource_monitoring.py +0 -0
  306. {funboost-47.9 → funboost-48.1}/funboost/utils/restart_python.py +0 -0
  307. {funboost-47.9 → funboost-48.1}/funboost/utils/simple_data_class.py +0 -0
  308. {funboost-47.9 → funboost-48.1}/funboost/utils/str_utils.py +0 -0
  309. {funboost-47.9 → funboost-48.1}/funboost/utils/time_util.py +0 -0
  310. {funboost-47.9 → funboost-48.1}/funboost/utils/times/__init__.py +0 -0
  311. {funboost-47.9 → funboost-48.1}/funboost/utils/times/version.py +0 -0
  312. {funboost-47.9 → funboost-48.1}/funboost/utils/un_strict_json_dumps.py +0 -0
  313. {funboost-47.9 → funboost-48.1}/funboost.egg-info/dependency_links.txt +0 -0
  314. {funboost-47.9 → funboost-48.1}/funboost.egg-info/entry_points.txt +0 -0
  315. {funboost-47.9 → funboost-48.1}/funboost.egg-info/top_level.txt +0 -0
  316. {funboost-47.9 → funboost-48.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 47.9
3
+ Version: 48.1
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -26,97 +26,10 @@ Classifier: Programming Language :: Python :: 3.12
26
26
  Classifier: Programming Language :: Python :: 3 :: Only
27
27
  Classifier: Topic :: Software Development :: Libraries
28
28
  Description-Content-Type: text/markdown
29
- License-File: LICENSE
30
- Requires-Dist: nb_log>=13.2
31
- Requires-Dist: nb_libs>=1.8
32
- Requires-Dist: nb_time>=2.1
33
- Requires-Dist: pymongo>=4.6.3
34
- Requires-Dist: AMQPStorm==2.10.6
35
- Requires-Dist: rabbitpy==2.0.1
36
- Requires-Dist: decorator==5.1.1
37
- Requires-Dist: tomorrow3==1.1.0
38
- Requires-Dist: persist-queue>=0.4.2
39
- Requires-Dist: apscheduler>=3.10.1
40
- Requires-Dist: pikav0
41
- Requires-Dist: pikav1
42
- Requires-Dist: redis2
43
- Requires-Dist: redis3
44
- Requires-Dist: redis5
45
- Requires-Dist: redis
46
- Requires-Dist: setuptools_rust
47
- Requires-Dist: fabric2==2.6.0
48
- Requires-Dist: nb_filelock
49
- Requires-Dist: pysnooper
50
- Requires-Dist: deprecated
51
- Requires-Dist: cryptography
52
- Requires-Dist: auto_run_on_remote
53
- Requires-Dist: frozenlist
54
- Requires-Dist: fire
55
- Requires-Dist: pydantic
56
- Requires-Dist: orjson
57
- Requires-Dist: async-timeout
58
- Requires-Dist: typing-extensions
59
29
  Provides-Extra: all
60
- Requires-Dist: confluent_kafka==1.7.0; extra == "all"
61
- Requires-Dist: pulsar-client==3.1.0; python_version >= "3.7" and extra == "all"
62
- Requires-Dist: celery; extra == "all"
63
- Requires-Dist: flower; extra == "all"
64
- Requires-Dist: nameko==2.14.1; extra == "all"
65
- Requires-Dist: sqlalchemy==1.4.13; extra == "all"
66
- Requires-Dist: sqlalchemy_utils==0.36.1; extra == "all"
67
- Requires-Dist: dramatiq==1.14.2; extra == "all"
68
- Requires-Dist: huey==2.4.5; extra == "all"
69
- Requires-Dist: rq==1.15.0; extra == "all"
70
- Requires-Dist: kombu; extra == "all"
71
- Requires-Dist: eventlet==0.33.3; extra == "all"
72
- Requires-Dist: gevent==22.10.2; extra == "all"
73
- Requires-Dist: elasticsearch; extra == "all"
74
- Requires-Dist: gnsq==1.0.1; extra == "all"
75
- Requires-Dist: psutil; extra == "all"
76
- Requires-Dist: peewee==3.17.3; extra == "all"
77
- Requires-Dist: nats-python; extra == "all"
78
- Requires-Dist: aiohttp==3.8.3; extra == "all"
79
- Requires-Dist: paho-mqtt; extra == "all"
80
- Requires-Dist: rocketmq; extra == "all"
81
- Requires-Dist: zmq; extra == "all"
82
- Requires-Dist: pyzmq; extra == "all"
83
- Requires-Dist: kafka-python==2.0.2; extra == "all"
84
- Requires-Dist: flask; extra == "all"
85
- Requires-Dist: flask_bootstrap; extra == "all"
86
- Requires-Dist: flask_wtf; extra == "all"
87
- Requires-Dist: wtforms; extra == "all"
88
- Requires-Dist: flask_login; extra == "all"
89
- Provides-Extra: extra-brokers
90
- Requires-Dist: confluent_kafka==1.7.0; extra == "extra-brokers"
91
- Requires-Dist: pulsar-client==3.1.0; python_version >= "3.7" and extra == "extra-brokers"
92
- Requires-Dist: celery; extra == "extra-brokers"
93
- Requires-Dist: flower; extra == "extra-brokers"
94
- Requires-Dist: nameko==2.14.1; extra == "extra-brokers"
95
- Requires-Dist: sqlalchemy==1.4.13; extra == "extra-brokers"
96
- Requires-Dist: sqlalchemy_utils==0.36.1; extra == "extra-brokers"
97
- Requires-Dist: dramatiq==1.14.2; extra == "extra-brokers"
98
- Requires-Dist: huey==2.4.5; extra == "extra-brokers"
99
- Requires-Dist: rq==1.15.0; extra == "extra-brokers"
100
- Requires-Dist: kombu; extra == "extra-brokers"
101
- Requires-Dist: eventlet==0.33.3; extra == "extra-brokers"
102
- Requires-Dist: gevent==22.10.2; extra == "extra-brokers"
103
- Requires-Dist: elasticsearch; extra == "extra-brokers"
104
- Requires-Dist: gnsq==1.0.1; extra == "extra-brokers"
105
- Requires-Dist: psutil; extra == "extra-brokers"
106
- Requires-Dist: peewee==3.17.3; extra == "extra-brokers"
107
- Requires-Dist: nats-python; extra == "extra-brokers"
108
- Requires-Dist: aiohttp==3.8.3; extra == "extra-brokers"
109
- Requires-Dist: paho-mqtt; extra == "extra-brokers"
110
- Requires-Dist: rocketmq; extra == "extra-brokers"
111
- Requires-Dist: zmq; extra == "extra-brokers"
112
- Requires-Dist: pyzmq; extra == "extra-brokers"
113
- Requires-Dist: kafka-python==2.0.2; extra == "extra-brokers"
30
+ Provides-Extra: extra_brokers
114
31
  Provides-Extra: flask
115
- Requires-Dist: flask; extra == "flask"
116
- Requires-Dist: flask_bootstrap; extra == "flask"
117
- Requires-Dist: flask_wtf; extra == "flask"
118
- Requires-Dist: wtforms; extra == "flask"
119
- Requires-Dist: flask_login; extra == "flask"
32
+ License-File: LICENSE
120
33
 
121
34
 
122
35
 
@@ -146,7 +59,7 @@ funboost的功能是全面性重量级,用户能想得到的功能99%全都有
146
59
 
147
60
  python函数加速器,框架包罗万象,一统编程思维,兼容50% python编程业务场景,适用范围广。
148
61
  python万能分布式函数调度框架,支持5种并发模式,30+种消息队列中间件(或任务队列框架),
149
- 30种任务控制功能。给任意python函数赋能。
62
+ 30种任务控制功能。给任意python函数赋能。
150
63
  用途概念就是常规经典的 生产者 + 消息队列中间件 + 消费者 编程思想。
151
64
 
152
65
  框架只需要学习@boost这一个装饰器的入参就可以,所有用法几乎和1.3例子一摸一样,非常简化简单。
@@ -528,7 +441,9 @@ if __name__ == "__main__":
528
441
 
529
442
  <a href="https://imgse.com/i/pkFkCUe"><img src="https://s21.ax1x.com/2024/04/29/pkFkCUe.png" alt="pkFkCUe.png" border="0" /></a>
530
443
 
531
- <a href="https://imgse.com/i/pkE6IYR"><img src="https://s21.ax1x.com/2024/05/07/pkE6IYR.png" alt="pkE6IYR.png" border="0" /></a>
444
+ [![pEGDim8.png](https://s21.ax1x.com/2025/03/03/pEGDim8.png)](https://imgse.com/i/pEGDim8)
445
+ [![pEGD96P.png](https://s21.ax1x.com/2025/03/03/pEGD96P.png)](https://imgse.com/i/pEGD96P)
446
+ [![pEGDCOf.png](https://s21.ax1x.com/2025/03/03/pEGDCOf.png)](https://imgse.com/i/pEGDCOf)
532
447
 
533
448
  ## 1.4 python分布式函数执行为什么重要?
534
449
 
@@ -26,7 +26,7 @@ funboost的功能是全面性重量级,用户能想得到的功能99%全都有
26
26
 
27
27
  python函数加速器,框架包罗万象,一统编程思维,兼容50% python编程业务场景,适用范围广。
28
28
  python万能分布式函数调度框架,支持5种并发模式,30+种消息队列中间件(或任务队列框架),
29
- 30种任务控制功能。给任意python函数赋能。
29
+ 30种任务控制功能。给任意python函数赋能。
30
30
  用途概念就是常规经典的 生产者 + 消息队列中间件 + 消费者 编程思想。
31
31
 
32
32
  框架只需要学习@boost这一个装饰器的入参就可以,所有用法几乎和1.3例子一摸一样,非常简化简单。
@@ -408,7 +408,9 @@ if __name__ == "__main__":
408
408
 
409
409
  <a href="https://imgse.com/i/pkFkCUe"><img src="https://s21.ax1x.com/2024/04/29/pkFkCUe.png" alt="pkFkCUe.png" border="0" /></a>
410
410
 
411
- <a href="https://imgse.com/i/pkE6IYR"><img src="https://s21.ax1x.com/2024/05/07/pkE6IYR.png" alt="pkE6IYR.png" border="0" /></a>
411
+ [![pEGDim8.png](https://s21.ax1x.com/2025/03/03/pEGDim8.png)](https://imgse.com/i/pEGDim8)
412
+ [![pEGD96P.png](https://s21.ax1x.com/2025/03/03/pEGD96P.png)](https://imgse.com/i/pEGD96P)
413
+ [![pEGDCOf.png](https://s21.ax1x.com/2025/03/03/pEGDCOf.png)](https://imgse.com/i/pEGDCOf)
412
414
 
413
415
  ## 1.4 python分布式函数执行为什么重要?
414
416
 
@@ -473,4 +475,4 @@ funboost通过支持celery作为broker_kind,使celer框架变成了funboost的
473
475
 
474
476
  ![](https://visitor-badge.glitch.me/badge?page_id=distributed_framework)
475
477
 
476
- <div> </div>
478
+ <div> </div>
@@ -13,7 +13,7 @@ set_frame_config这个模块的 use_config_form_funboost_config_module() 是核
13
13
  这段注释说明和使用的用户无关,只和框架开发人员有关.
14
14
  '''
15
15
 
16
- __version__ = "47.9"
16
+ __version__ = "48.1"
17
17
 
18
18
  from funboost.set_frame_config import show_frame_config
19
19
 
@@ -42,7 +42,7 @@ from funboost.factories.broker_kind__publsiher_consumer_type_map import register
42
42
  from funboost.factories.publisher_factotry import get_publisher
43
43
  from funboost.factories.consumer_factory import get_consumer
44
44
 
45
- from funboost.timing_job import fsdf_background_scheduler, timing_publish_deco, funboost_aps_scheduler
45
+ from funboost.timing_job import fsdf_background_scheduler, timing_publish_deco, funboost_aps_scheduler,ApsJobAdder
46
46
  from funboost.constant import BrokerEnum, ConcurrentModeEnum
47
47
 
48
48
  from funboost.core.booster import boost, Booster, BoostersManager
@@ -58,7 +58,7 @@ from funboost.utils.ctrl_c_end import ctrl_c_recv
58
58
  from funboost.utils.redis_manager import RedisMixin
59
59
  from funboost.concurrent_pool.custom_threadpool_executor import show_current_threads_num
60
60
 
61
- from funboost.core.current_task import funboost_current_task
61
+ from funboost.core.current_task import funboost_current_task,fct,get_current_taskid
62
62
 
63
63
 
64
64
  # atexit.register(ctrl_c_recv) # 还是需要用户自己在代码末尾加才可以.
@@ -85,7 +85,7 @@ class CeleryHelper:
85
85
 
86
86
  if is_start_consume_all_queues is False:
87
87
  to_be_start_work_celery_queue_name_set_new = copy.copy(cls.to_be_start_work_celery_queue_name_set)
88
- to_be_start_work_celery_queue_name_set_new.update(set(start_consume_queue_name_list))
88
+ to_be_start_work_celery_queue_name_set_new.update(set(start_consume_queue_name_list or []))
89
89
  else:
90
90
  from funboost import BoostersManager
91
91
  # print(BoostersManager.get_all_queues())
@@ -1,4 +1,7 @@
1
1
  # coding= utf-8
2
+ from calendar import c
3
+
4
+
2
5
  class BrokerEnum:
3
6
  EMPTY = 'empty' # 空的实现,需要搭配 boost入参的 consumer_override_cls 和 publisher_override_cls使用,或者被继承。
4
7
 
@@ -106,3 +109,7 @@ class ConstStrForClassMethod:
106
109
  CLS_MODULE = 'cls_module'
107
110
  CLS_FILE = 'cls_file'
108
111
 
112
+ class RedisKeys:
113
+ REDIS_KEY_PAUSE_FLAG = 'funboost_pause_flag'
114
+ REDIS_KEY_STOP_FLAG = 'funboost_stop_flag'
115
+ QUEUE__MSG_COUNT_MAP = 'funboost_queue__msg_count_map'
@@ -74,7 +74,7 @@ from funboost.consumers.redis_filter import RedisFilter, RedisImpermanencyFilter
74
74
  from funboost.factories.publisher_factotry import get_publisher
75
75
 
76
76
  from funboost.utils import decorators, time_util, redis_manager
77
- from funboost.constant import ConcurrentModeEnum, BrokerEnum, ConstStrForClassMethod
77
+ from funboost.constant import ConcurrentModeEnum, BrokerEnum, ConstStrForClassMethod,RedisKeys
78
78
  from funboost.core import kill_remote_task
79
79
  from funboost.core.exceptions import ExceptionForRequeue, ExceptionForPushToDlxqueue
80
80
 
@@ -164,19 +164,25 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
164
164
  filter_class = RedisFilter if consumer_params.task_filtering_expire_seconds == 0 else RedisImpermanencyFilter
165
165
  self._redis_filter = filter_class(self._redis_filter_key_name, consumer_params.task_filtering_expire_seconds)
166
166
 
167
- self._unit_time_for_count = 10 # 每隔多少秒计数,显示单位时间内执行多少次,暂时固定为10秒。
168
- self._execute_task_times_every_unit_time = 0 # 每单位时间执行了多少次任务。
169
167
  self._lock_for_count_execute_task_times_every_unit_time = Lock()
170
- self._current_time_for_execute_task_times_every_unit_time = time.time()
171
- self._consuming_function_cost_time_total_every_unit_time = 0
172
- self._last_execute_task_time = time.time() # 最近一次执行任务的时间。
173
-
174
- self._last_show_remaining_execution_time = 0
175
- self._show_remaining_execution_time_interval = 300
176
-
177
- self._msg_num_in_broker = 0
178
- self._last_timestamp_when_has_task_in_queue = 0
179
- self._last_timestamp_print_msg_num = 0
168
+ # self._unit_time_for_count = 10 # 每隔多少秒计数,显示单位时间内执行多少次,暂时固定为10秒。
169
+ # self._execute_task_times_every_unit_time = 0 # 每单位时间执行了多少次任务。
170
+ # self._execute_task_times_every_unit_time_fail =0 # 每单位时间执行了多少次任务失败。
171
+ # self._lock_for_count_execute_task_times_every_unit_time = Lock()
172
+ # self._current_time_for_execute_task_times_every_unit_time = time.time()
173
+ # self._consuming_function_cost_time_total_every_unit_time = 0
174
+ # self._last_execute_task_time = time.time() # 最近一次执行任务的时间。
175
+ # self._last_10s_execute_count = 0
176
+ # self._last_10s_execute_count_fail = 0
177
+ #
178
+ # self._last_show_remaining_execution_time = 0
179
+ # self._show_remaining_execution_time_interval = 300
180
+ #
181
+ # self._msg_num_in_broker = 0
182
+ # self._last_timestamp_when_has_task_in_queue = 0
183
+ # self._last_timestamp_print_msg_num = 0
184
+
185
+ self.metric_calculation = MetricCalculation(self)
180
186
 
181
187
  self._result_persistence_helper: ResultPersistenceHelper
182
188
  self._check_broker_exclusive_config()
@@ -189,8 +195,8 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
189
195
  self._stop_flag = None
190
196
  self._pause_flag = None # 暂停消费标志,从reids读取
191
197
  self._last_show_pause_log_time = 0
192
- self._redis_key_stop_flag = f'funboost_stop_flag:{self.queue_name}'
193
- self._redis_key_pause_flag = f'funboost_pause_flag:{self.queue_name}'
198
+ # self._redis_key_stop_flag = f'funboost_stop_flag'
199
+ # self._redis_key_pause_flag = RedisKeys.REDIS_KEY_PAUSE_FLAG
194
200
 
195
201
  # 控频要用到的成员变量
196
202
  self._last_submit_task_timestamp = 0
@@ -358,7 +364,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
358
364
  self._distributed_consumer_statistics.run()
359
365
  self.logger.warning(f'启动了分布式环境 使用 redis 的键 hearbeat:{self._queue_name} 统计活跃消费者 ,当前消费者唯一标识为 {self.consumer_identification}')
360
366
 
361
- self.keep_circulating(60, block=False, daemon=False)(self.check_heartbeat_and_message_count)() # 间隔时间最好比self._unit_time_for_count小整数倍,不然日志不准。
367
+ self.keep_circulating(60, block=False, daemon=False)(self.check_heartbeat_and_message_count)()
362
368
  if self.consumer_params.is_support_remote_kill_task:
363
369
  kill_remote_task.RemoteTaskKiller(self.queue_name, None).start_cycle_kill_task()
364
370
  self.consumer_params.is_show_message_get_from_broker = True # 方便用户看到从消息队列取出来的消息的task_id,然后使用task_id杀死运行中的消息。
@@ -403,13 +409,9 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
403
409
  logger_apscheduler = get_logger('push_for_apscheduler_use_database_store', log_filename='push_for_apscheduler_use_database_store.log')
404
410
 
405
411
  @classmethod
406
- def _push_apscheduler_task_to_broker(cls, queue_name, msg, runonce_uuid):
412
+ def _push_apscheduler_task_to_broker(cls, queue_name, msg):
407
413
  funboost_lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
408
- # key = 'apscheduler.redisjobstore_runonce'
409
- # if RedisMixin().redis_db_frame.sadd(key, runonce_uuid): # 这样可以阻止多次启动同队列名消费者 redis jobstore多次运行函数.
410
- # cls.logger_apscheduler.debug(f'延时任务用普通消息重新发布到普通队列 {msg}')
411
- # funboost_lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
412
-
414
+
413
415
  @abc.abstractmethod
414
416
  def _shedual_task(self):
415
417
  """
@@ -512,7 +514,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
512
514
  # print(msg_no_delay)
513
515
  # 数据库作为apscheduler的jobstores时候, 不能用 self.pbulisher_of_same_queue.publish,self不能序列化
514
516
  self._delay_task_scheduler.add_job(self._push_apscheduler_task_to_broker, 'date', run_date=run_date,
515
- kwargs={'queue_name': self.queue_name, 'msg': msg_no_delay, 'runonce_uuid': str(uuid.uuid4())},
517
+ kwargs={'queue_name': self.queue_name, 'msg': msg_no_delay, },
516
518
  misfire_grace_time=misfire_grace_time,
517
519
  )
518
520
  self._confirm_consume(kw)
@@ -681,26 +683,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
681
683
  p.execute()
682
684
 
683
685
  with self._lock_for_count_execute_task_times_every_unit_time:
684
- self._execute_task_times_every_unit_time += 1
685
- self._consuming_function_cost_time_total_every_unit_time += time.time() - t_start_run_fun
686
- self._last_execute_task_time = time.time()
687
- if time.time() - self._current_time_for_execute_task_times_every_unit_time > self._unit_time_for_count:
688
- avarage_function_spend_time = round(self._consuming_function_cost_time_total_every_unit_time / self._execute_task_times_every_unit_time, 4)
689
- msg = f'{self._unit_time_for_count} 秒内执行了 {self._execute_task_times_every_unit_time} 次函数 [ {self.consuming_function.__name__} ] ,' \
690
- f'函数平均运行耗时 {avarage_function_spend_time} 秒。 '
691
- self.logger.info(msg)
692
- if time.time() - self._last_show_remaining_execution_time > self._show_remaining_execution_time_interval:
693
- self._msg_num_in_broker = self.publisher_of_same_queue.get_message_count()
694
- if self._msg_num_in_broker != -1: # 有的中间件无法统计或没实现统计队列剩余数量的,统一返回的是-1,不显示这句话。
695
- # msg += f''' ,预计还需要 {time_util.seconds_to_hour_minute_second(self._msg_num_in_broker * avarage_function_spend_time / active_consumer_num)} 时间 才能执行完成 {self._msg_num_in_broker}个剩余的任务'''
696
- need_time = time_util.seconds_to_hour_minute_second(self._msg_num_in_broker / (self._execute_task_times_every_unit_time / self._unit_time_for_count) /
697
- self._distributed_consumer_statistics.active_consumer_num)
698
- msg += f''' 预计还需要 {need_time} 时间 才能执行完成 队列 {self.queue_name} 中的 {self._msg_num_in_broker} 个剩余任务'''
699
- self.logger.info(msg)
700
- self._last_show_remaining_execution_time = time.time()
701
- self._current_time_for_execute_task_times_every_unit_time = time.time()
702
- self._consuming_function_cost_time_total_every_unit_time = 0
703
- self._execute_task_times_every_unit_time = 0
686
+ self.metric_calculation.cal(t_start_run_fun,current_function_result_status)
704
687
  self.user_custom_record_process_info_func(current_function_result_status) # 两种方式都可以自定义,记录结果,建议继承方式,不使用boost中指定 user_custom_record_process_info_func
705
688
  if self.consumer_params.user_custom_record_process_info_func:
706
689
  self.consumer_params.user_custom_record_process_info_func(current_function_result_status)
@@ -854,24 +837,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
854
837
  await simple_run_in_executor(push_result)
855
838
 
856
839
  # 异步执行不存在线程并发,不需要加锁。
857
- self._execute_task_times_every_unit_time += 1
858
- self._consuming_function_cost_time_total_every_unit_time += time.time() - t_start_run_fun
859
- self._last_execute_task_time = time.time()
860
- if time.time() - self._current_time_for_execute_task_times_every_unit_time > self._unit_time_for_count:
861
- avarage_function_spend_time = round(self._consuming_function_cost_time_total_every_unit_time / self._execute_task_times_every_unit_time, 4)
862
- msg = f'{self._unit_time_for_count} 秒内执行了 {self._execute_task_times_every_unit_time} 次函数 [ {self.consuming_function.__name__} ] ,' \
863
- f'函数平均运行耗时 {avarage_function_spend_time} 秒。 '
864
- self.logger.info(msg)
865
- if self._msg_num_in_broker != -1 and time.time() - self._last_show_remaining_execution_time > self._show_remaining_execution_time_interval: # 有的中间件无法统计或没实现统计队列剩余数量的,统一返回的是-1,不显示这句话。
866
- # msg += f''' ,预计还需要 {time_util.seconds_to_hour_minute_second(self._msg_num_in_broker * avarage_function_spend_time / active_consumer_num)} 时间 才能执行完成 {self._msg_num_in_broker}个剩余的任务'''
867
- need_time = time_util.seconds_to_hour_minute_second(self._msg_num_in_broker / (self._execute_task_times_every_unit_time / self._unit_time_for_count) /
868
- self._distributed_consumer_statistics.active_consumer_num)
869
- msg += f''' 预计还需要 {need_time} 时间 才能执行完成 队列 {self.queue_name} 中的 {self._msg_num_in_broker} 个剩余任务'''
870
- self.logger.info(msg)
871
- self._last_show_remaining_execution_time = time.time()
872
- self._current_time_for_execute_task_times_every_unit_time = time.time()
873
- self._consuming_function_cost_time_total_every_unit_time = 0
874
- self._execute_task_times_every_unit_time = 0
840
+ self.metric_calculation.cal(t_start_run_fun, current_function_result_status)
875
841
 
876
842
  self.user_custom_record_process_info_func(current_function_result_status) # 两种方式都可以自定义,记录结果.建议使用文档4.21.b的方式继承来重写
877
843
  await self.aio_user_custom_record_process_info_func(current_function_result_status)
@@ -958,14 +924,15 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
958
924
  raise NotImplementedError
959
925
 
960
926
  def check_heartbeat_and_message_count(self):
961
- self._msg_num_in_broker = self.publisher_of_same_queue.get_message_count()
962
- if time.time() - self._last_timestamp_print_msg_num > 600:
963
- if self._msg_num_in_broker != -1:
964
- self.logger.info(f'队列 [{self._queue_name}] 中还有 [{self._msg_num_in_broker}] 个任务')
965
- self._last_timestamp_print_msg_num = time.time()
966
- if self._msg_num_in_broker != 0:
967
- self._last_timestamp_when_has_task_in_queue = time.time()
968
- return self._msg_num_in_broker
927
+ self.metric_calculation.msg_num_in_broker = self.publisher_of_same_queue.get_message_count()
928
+ self.metric_calculation.last_get_msg_num_ts = time.time()
929
+ if time.time() - self.metric_calculation.last_timestamp_print_msg_num > 600:
930
+ if self.metric_calculation.msg_num_in_broker != -1:
931
+ self.logger.info(f'队列 [{self._queue_name}] 中还有 [{self.metric_calculation.msg_num_in_broker}] 个任务')
932
+ self.metric_calculation.last_timestamp_print_msg_num = time.time()
933
+ if self.metric_calculation.msg_num_in_broker != 0:
934
+ self.metric_calculation.last_timestamp_when_has_task_in_queue = time.time()
935
+ return self.metric_calculation.msg_num_in_broker
969
936
 
970
937
  @abc.abstractmethod
971
938
  def _requeue(self, kw):
@@ -1003,11 +970,11 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
1003
970
 
1004
971
  def pause_consume(self):
1005
972
  """从远程机器可以设置队列为暂停消费状态,funboost框架会自动停止消费,此功能需要配置好redis"""
1006
- RedisMixin().redis_db_frame.set(self._redis_key_pause_flag, 1)
973
+ RedisMixin().redis_db_frame.hset(RedisKeys.REDIS_KEY_PAUSE_FLAG, self.queue_name,'1')
1007
974
 
1008
975
  def continue_consume(self):
1009
976
  """从远程机器可以设置队列为暂停消费状态,funboost框架会自动继续消费,此功能需要配置好redis"""
1010
- RedisMixin().redis_db_frame.set(self._redis_key_pause_flag, 0)
977
+ RedisMixin().redis_db_frame.hset(RedisKeys.REDIS_KEY_PAUSE_FLAG, self.queue_name,'0')
1011
978
 
1012
979
  @decorators.FunctionResultCacher.cached_function_result_for_a_time(120)
1013
980
  def _judge_is_daylight(self):
@@ -1031,9 +998,9 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
1031
998
  no_task_time = 0
1032
999
  while 1:
1033
1000
  # noinspection PyBroadException
1034
- message_count = self._msg_num_in_broker
1001
+ message_count = self.metric_calculation.msg_num_in_broker
1035
1002
  # print(message_count,self._last_execute_task_time,time.time() - self._last_execute_task_time,no_task_time)
1036
- if message_count == 0 and self._last_execute_task_time != 0 and (time.time() - self._last_execute_task_time) > minutes * 60:
1003
+ if message_count == 0 and self.metric_calculation.last_execute_task_time != 0 and (time.time() - self.metric_calculation.last_execute_task_time) > minutes * 60:
1037
1004
  no_task_time += 30
1038
1005
  else:
1039
1006
  no_task_time = 0
@@ -1154,6 +1121,77 @@ def wait_for_possible_has_finish_all_tasks_by_conusmer_list(consumer_list: typin
1154
1121
  pool.submit(consumer.wait_for_possible_has_finish_all_tasks(minutes))
1155
1122
 
1156
1123
 
1124
+ class MetricCalculation:
1125
+ UNIT_TIME_FOR_COUNT = 10 # 这个不要随意改,需要其他地方配合,每隔多少秒计数,显示单位时间内执行多少次,暂时固定为10秒。
1126
+
1127
+ def __init__(self,conusmer:AbstractConsumer) -> None:
1128
+ self.consumer = conusmer
1129
+
1130
+ self.unit_time_for_count = self.UNIT_TIME_FOR_COUNT #
1131
+ self.execute_task_times_every_unit_time_temp = 0 # 每单位时间执行了多少次任务。
1132
+ self.execute_task_times_every_unit_time_temp_fail =0 # 每单位时间执行了多少次任务失败。
1133
+ self.current_time_for_execute_task_times_every_unit_time = time.time()
1134
+ self.consuming_function_cost_time_total_every_unit_time = 0
1135
+ self.last_execute_task_time = time.time() # 最近一次执行任务的时间。
1136
+ self.last_x_s_execute_count = 0
1137
+ self.last_x_s_execute_count_fail = 0
1138
+ self.last_show_remaining_execution_time = 0
1139
+ self.show_remaining_execution_time_interval = 300
1140
+ self.msg_num_in_broker = 0
1141
+ self.last_get_msg_num_ts = 0
1142
+ self.last_timestamp_when_has_task_in_queue = 0
1143
+ self.last_timestamp_print_msg_num = 0
1144
+ self.avarage_function_spend_time = None
1145
+ self.total_consume_count_from_start =0
1146
+ self.total_consume_count_from_start_fail =0
1147
+
1148
+ def cal(self,t_start_run_fun:float,current_function_result_status:FunctionResultStatus):
1149
+ self.execute_task_times_every_unit_time_temp += 1
1150
+ self.total_consume_count_from_start +=1
1151
+ if current_function_result_status.success is False:
1152
+ self.execute_task_times_every_unit_time_temp_fail += 1
1153
+ self.total_consume_count_from_start_fail +=1
1154
+ self.consuming_function_cost_time_total_every_unit_time += time.time() - t_start_run_fun
1155
+ self.last_execute_task_time = time.time()
1156
+ if time.time() - self.current_time_for_execute_task_times_every_unit_time > self.unit_time_for_count:
1157
+ self.last_x_s_execute_count = self.execute_task_times_every_unit_time_temp
1158
+ self.last_x_s_execute_count_fail = self.execute_task_times_every_unit_time_temp_fail
1159
+ self.avarage_function_spend_time = round(self.consuming_function_cost_time_total_every_unit_time / self.last_x_s_execute_count, 4)
1160
+ msg = f'{self.unit_time_for_count} 秒内执行了 {self.last_x_s_execute_count} 次函数 [ {self.consumer.consuming_function.__name__} ] ,' \
1161
+ f'失败了{self.last_x_s_execute_count_fail} 次,函数平均运行耗时 {self.avarage_function_spend_time} 秒。 '
1162
+ self.consumer.logger.info(msg)
1163
+ if time.time() - self.last_show_remaining_execution_time > self.show_remaining_execution_time_interval:
1164
+ self.msg_num_in_broker = self.consumer.publisher_of_same_queue.get_message_count()
1165
+ self.last_get_msg_num_ts = time.time()
1166
+ if self.msg_num_in_broker != -1: # 有的中间件无法统计或没实现统计队列剩余数量的,统一返回的是-1,不显示这句话。
1167
+ # msg += f''' ,预计还需要 {time_util.seconds_to_hour_minute_second(self._msg_num_in_broker * avarage_function_spend_time / active_consumer_num)} 时间 才能执行完成 {self._msg_num_in_broker}个剩余的任务'''
1168
+ need_time = time_util.seconds_to_hour_minute_second(self.msg_num_in_broker / (self.execute_task_times_every_unit_time_temp / self.unit_time_for_count) /
1169
+ self.consumer._distributed_consumer_statistics.active_consumer_num)
1170
+ msg += f''' 预计还需要 {need_time} 时间 才能执行完成 队列 {self.consumer.queue_name} 中的 {self.msg_num_in_broker} 个剩余任务'''
1171
+ self.consumer.logger.info(msg)
1172
+ self.last_show_remaining_execution_time = time.time()
1173
+ self.current_time_for_execute_task_times_every_unit_time = time.time()
1174
+ self.consuming_function_cost_time_total_every_unit_time = 0
1175
+ self.execute_task_times_every_unit_time_temp = 0
1176
+ self.execute_task_times_every_unit_time_temp_fail = 0
1177
+
1178
+ def get_report_hearbeat_info(self) ->dict:
1179
+ return {
1180
+ 'unit_time_for_count':self.unit_time_for_count,
1181
+ 'last_x_s_execute_count':self.last_x_s_execute_count,
1182
+ 'last_x_s_execute_count_fail':self.last_x_s_execute_count_fail,
1183
+ 'last_execute_task_time':self.last_execute_task_time,
1184
+ # 'last_show_remaining_execution_time':self.last_show_remaining_execution_time,
1185
+ # 'msg_num_in_broker':self.msg_num_in_broker,
1186
+ 'current_time_for_execute_task_times_every_unit_time':self.current_time_for_execute_task_times_every_unit_time,
1187
+ 'last_timestamp_when_has_task_in_queue':self.last_timestamp_when_has_task_in_queue,
1188
+ 'avarage_function_spend_time':self.avarage_function_spend_time,
1189
+ 'total_consume_count_from_start':self.total_consume_count_from_start,
1190
+ 'total_consume_count_from_start_fail':self.total_consume_count_from_start_fail
1191
+
1192
+ }
1193
+
1194
+
1157
1195
  class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
1158
1196
  """
1159
1197
  为了兼容模拟mq的中间件(例如redis,他没有实现amqp协议,redis的list结构和真mq差远了),获取一个队列有几个连接活跃消费者数量。
@@ -1190,9 +1228,18 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
1190
1228
  self._server__consumer_identification_map_key_name = f'funboost_hearbeat_server__dict:{nb_log_config_default.computer_ip}'
1191
1229
 
1192
1230
  def run(self):
1231
+ self._send_consumer_params()
1193
1232
  self.send_heartbeat()
1194
1233
  self._consumer.keep_circulating(self.SEND_HEARTBEAT_INTERVAL, block=False, daemon=False)(self.send_heartbeat)()
1195
1234
 
1235
+ def _send_consumer_params(self):
1236
+ """
1237
+ 保存队列的消费者参数,以便在web界面查看。
1238
+ :return:
1239
+ """
1240
+ self.redis_db_frame.hmset('funboost_queue__consumer_parmas',{self._consumer.queue_name: self._consumer.consumer_params.json_str_value()})
1241
+
1242
+
1196
1243
  def _send_heartbeat_with_dict_value(self, redis_key, ):
1197
1244
  # 发送当前消费者进程心跳的,值是字典,按一个机器或者一个队列运行了哪些进程。
1198
1245
 
@@ -1206,10 +1253,19 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
1206
1253
  p.srem(redis_key, result)
1207
1254
  self._consumer_identification_map['hearbeat_datetime_str'] = time_util.DatetimeConverter().datetime_str
1208
1255
  self._consumer_identification_map['hearbeat_timestamp'] = self.timestamp()
1256
+ self._consumer_identification_map.update(self._consumer.metric_calculation.get_report_hearbeat_info())
1209
1257
  value = Serialization.to_json_str(self._consumer_identification_map, )
1210
1258
  p.sadd(redis_key, value)
1211
1259
  p.execute()
1212
1260
 
1261
+
1262
+ def _send_msg_num(self):
1263
+ dic = {'msg_num_in_broker':self._consumer.metric_calculation.msg_num_in_broker,
1264
+ 'last_get_msg_num_ts':self._consumer.metric_calculation.last_get_msg_num_ts,
1265
+ 'report_ts':time.time(),
1266
+ }
1267
+ self.redis_db_frame.hset(RedisKeys.QUEUE__MSG_COUNT_MAP, self._consumer.queue_name, json.dumps(dic))
1268
+
1213
1269
  def send_heartbeat(self):
1214
1270
  # 根据队列名心跳的,值是字符串,方便值作为其他redis的键名
1215
1271
 
@@ -1226,6 +1282,7 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
1226
1282
  self._send_heartbeat_with_dict_value(self._server__consumer_identification_map_key_name)
1227
1283
  self._show_active_consumer_num()
1228
1284
  self._get_stop_and_pause_flag_from_redis()
1285
+ self._send_msg_num()
1229
1286
 
1230
1287
  def _show_active_consumer_num(self):
1231
1288
  self.active_consumer_num = self.redis_db_frame.scard(self._redis_key_name) or 1
@@ -1241,13 +1298,13 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
1241
1298
 
1242
1299
  # noinspection PyProtectedMember
1243
1300
  def _get_stop_and_pause_flag_from_redis(self):
1244
- stop_flag = self.redis_db_frame.get(self._consumer._redis_key_stop_flag)
1301
+ stop_flag = self.redis_db_frame.hget(RedisKeys.REDIS_KEY_STOP_FLAG,self._consumer.queue_name)
1245
1302
  if stop_flag is not None and int(stop_flag) == 1:
1246
1303
  self._consumer._stop_flag = 1
1247
1304
  else:
1248
1305
  self._consumer._stop_flag = 0
1249
1306
 
1250
- pause_flag = self.redis_db_frame.get(self._consumer._redis_key_pause_flag)
1307
+ pause_flag = self.redis_db_frame.hget(RedisKeys.REDIS_KEY_PAUSE_FLAG,self._consumer.queue_name)
1251
1308
  if pause_flag is not None and int(pause_flag) == 1:
1252
1309
  self._consumer._pause_flag = 1
1253
1310
  else:
@@ -126,7 +126,7 @@ class RedisConsumerAckAble(ConsumerConfirmMixinWithTheHelpOfRedisByHearbeat, Abs
126
126
  pull_msg_batch_size = self.consumer_params.broker_exclusive_config['pull_msg_batch_size']
127
127
  lua = f'''
128
128
  local task_list = redis.call("lrange", KEYS[1],0,{pull_msg_batch_size-1})
129
- redis.call("ltrim", KEYS[1],100,-1)
129
+ redis.call("ltrim", KEYS[1],{pull_msg_batch_size},-1)
130
130
  if (#task_list > 0) then
131
131
  for task_index,task_value in ipairs(task_list)
132
132
  do
@@ -1,9 +1,14 @@
1
1
  import json
2
+ import time
2
3
  import typing
3
4
 
5
+ from pydantic import main
6
+
4
7
  from funboost.utils.redis_manager import RedisMixin
5
8
 
6
9
  from funboost.core.loggers import FunboostFileLoggerMixin,nb_log_config_default
10
+ from funboost.core.serialization import Serialization
11
+ from funboost.constant import RedisKeys
7
12
 
8
13
  class ActiveCousumerProcessInfoGetter(RedisMixin, FunboostFileLoggerMixin):
9
14
  """
@@ -23,6 +28,9 @@ class ActiveCousumerProcessInfoGetter(RedisMixin, FunboostFileLoggerMixin):
23
28
  result_dict = json.loads(result)
24
29
  if self.timestamp() - result_dict['hearbeat_timestamp'] < 15:
25
30
  active_consumers_processor_info_list.append(result_dict)
31
+ if self.timestamp() - result_dict['current_time_for_execute_task_times_every_unit_time'] > 30:
32
+ result_dict['last_x_s_execute_count'] = 0
33
+ result_dict['last_x_s_execute_count_fail'] = 0
26
34
  return active_consumers_processor_info_list
27
35
 
28
36
  def get_all_hearbeat_info_by_queue_name(self, queue_name) -> typing.List[typing.Dict]:
@@ -67,6 +75,9 @@ class ActiveCousumerProcessInfoGetter(RedisMixin, FunboostFileLoggerMixin):
67
75
  info_dict = json.loads(info_str)
68
76
  if self.timestamp() - info_dict['hearbeat_timestamp'] < 15:
69
77
  infos_map[dict_key].append(info_dict)
78
+ if self.timestamp() - info_dict['current_time_for_execute_task_times_every_unit_time'] > 30:
79
+ info_dict['last_x_s_execute_count'] = 0
80
+ info_dict['last_x_s_execute_count_fail'] = 0
70
81
  return infos_map
71
82
 
72
83
  def get_all_hearbeat_info_partition_by_queue_name(self) -> typing.Dict[typing.AnyStr, typing.List[typing.Dict]]:
@@ -80,3 +91,52 @@ class ActiveCousumerProcessInfoGetter(RedisMixin, FunboostFileLoggerMixin):
80
91
  infos_map = self._get_all_hearbeat_info_partition_by_redis_key_prefix('funboost_hearbeat_server__dict:')
81
92
  self.logger.info(f'获取所有机器ip对应的活跃消费者进程信息,按机器ip划分,结果是 {json.dumps(infos_map, indent=4)}')
82
93
  return infos_map
94
+
95
+
96
+
97
+ class QueueConusmerParamsGetter(RedisMixin, FunboostFileLoggerMixin):
98
+
99
+ def get_queue_params(self):
100
+ queue__consumer_params_map = self.redis_db_frame.hgetall('funboost_queue__consumer_parmas')
101
+ return {k:Serialization.to_dict(v) for k,v in queue__consumer_params_map.items()}
102
+
103
+ def get_pause_flag(self):
104
+ queue__pause_map = self.redis_db_frame.hgetall(RedisKeys.REDIS_KEY_PAUSE_FLAG)
105
+ return {k:int(v) for k,v in queue__pause_map.items()}
106
+
107
+ def get_msg_num(self):
108
+ queue__msg_count_info_map = self.redis_db_frame.hgetall(RedisKeys.QUEUE__MSG_COUNT_MAP)
109
+ queue__msg_count_dict = {}
110
+ for queue_name,info_json in queue__msg_count_info_map.items():
111
+ info_dict = json.loads(info_json)
112
+ if info_dict['report_ts'] > time.time() - 15 and info_dict['last_get_msg_num_ts'] > time.time() - 1200:
113
+ queue__msg_count_dict[queue_name] = info_dict['msg_num_in_broker']
114
+ return queue__msg_count_dict
115
+
116
+ def get_queue_params_and_active_consumers(self):
117
+ queue__active_consumers_map = ActiveCousumerProcessInfoGetter().get_all_hearbeat_info_partition_by_queue_name()
118
+ queue__consumer_params_map = self.get_queue_params()
119
+ queue__pause_map = self.get_pause_flag()
120
+ queue__msg_count_dict = self.get_msg_num()
121
+ queue_params_and_active_consumers = {}
122
+
123
+ for queue, consumer_params in queue__consumer_params_map.items():
124
+ active_consumers = queue__active_consumers_map.get(queue, [])
125
+ all_consumers_last_x_s_execute_count = 0
126
+ all_consumers_last_x_s_execute_count_fail =0
127
+ for c in active_consumers:
128
+ all_consumers_last_x_s_execute_count += c['last_x_s_execute_count']
129
+ all_consumers_last_x_s_execute_count_fail += c['last_x_s_execute_count_fail']
130
+ queue_params_and_active_consumers[queue] = {
131
+ 'queue_params':consumer_params,
132
+ 'active_consumers':active_consumers,
133
+ 'pause_flag':queue__pause_map.get(queue,-1),
134
+ 'msg_num_in_broker':queue__msg_count_dict.get(queue,None),
135
+ 'all_consumers_last_x_s_execute_count':all_consumers_last_x_s_execute_count,
136
+ 'all_consumers_last_x_s_execute_count_fail':all_consumers_last_x_s_execute_count_fail,
137
+ }
138
+ return queue_params_and_active_consumers
139
+
140
+
141
+ if __name__ == '__main__':
142
+ print(Serialization.to_json_str(QueueConusmerParamsGetter().get_queue_params_and_active_consumers()))