funboost 50.2__tar.gz → 50.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-50.2/funboost.egg-info → funboost-50.3}/PKG-INFO +5 -5
  2. {funboost-50.2 → funboost-50.3}/README.md +4 -4
  3. {funboost-50.2 → funboost-50.3}/funboost/__init__.py +1 -1
  4. {funboost-50.2 → funboost-50.3}/funboost/consumers/base_consumer.py +4 -0
  5. {funboost-50.2 → funboost-50.3}/funboost/consumers/grpc_consumer.py +1 -18
  6. funboost-50.3/funboost/consumers/http_consumer.py +138 -0
  7. funboost-50.3/funboost/consumers/http_consumer_aiohttp_old.py +113 -0
  8. {funboost-50.2 → funboost-50.3}/funboost/consumers/kafka_consumer.py +1 -4
  9. {funboost-50.2 → funboost-50.3}/funboost/core/booster.py +31 -2
  10. funboost-50.3/funboost/core/funboost_time.py +130 -0
  11. {funboost-50.2 → funboost-50.3}/funboost/core/func_params_model.py +21 -3
  12. {funboost-50.2 → funboost-50.3}/funboost/core/helper_funs.py +9 -8
  13. {funboost-50.2 → funboost-50.3}/funboost/core/msg_result_getter.py +27 -0
  14. {funboost-50.2 → funboost-50.3}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +8 -3
  15. {funboost-50.2 → funboost-50.3}/funboost/publishers/base_publisher.py +5 -0
  16. funboost-50.3/funboost/publishers/http_publisher.py +53 -0
  17. {funboost-50.2 → funboost-50.3/funboost.egg-info}/PKG-INFO +5 -5
  18. {funboost-50.2 → funboost-50.3}/funboost.egg-info/SOURCES.txt +1 -0
  19. {funboost-50.2 → funboost-50.3}/funboost.egg-info/requires.txt +2 -0
  20. {funboost-50.2 → funboost-50.3}/setup.py +4 -2
  21. funboost-50.2/funboost/consumers/http_consumer.py +0 -71
  22. funboost-50.2/funboost/core/funboost_time.py +0 -86
  23. funboost-50.2/funboost/publishers/http_publisher.py +0 -35
  24. {funboost-50.2 → funboost-50.3}/LICENSE +0 -0
  25. {funboost-50.2 → funboost-50.3}/MANIFEST.in +0 -0
  26. {funboost-50.2 → funboost-50.3}/funboost/__init__old.py +0 -0
  27. {funboost-50.2 → funboost-50.3}/funboost/__main__.py +0 -0
  28. {funboost-50.2 → funboost-50.3}/funboost/assist/__init__.py +0 -0
  29. {funboost-50.2 → funboost-50.3}/funboost/assist/celery_helper.py +0 -0
  30. {funboost-50.2 → funboost-50.3}/funboost/assist/dramatiq_helper.py +0 -0
  31. {funboost-50.2 → funboost-50.3}/funboost/assist/faststream_helper.py +0 -0
  32. {funboost-50.2 → funboost-50.3}/funboost/assist/huey_helper.py +0 -0
  33. {funboost-50.2 → funboost-50.3}/funboost/assist/rocketry_helper.py +0 -0
  34. {funboost-50.2 → funboost-50.3}/funboost/assist/rq_helper.py +0 -0
  35. {funboost-50.2 → funboost-50.3}/funboost/assist/rq_windows_worker.py +0 -0
  36. {funboost-50.2 → funboost-50.3}/funboost/assist/taskiq_helper.py +0 -0
  37. {funboost-50.2 → funboost-50.3}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
  38. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/__init__.py +0 -0
  39. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/async_helper.py +0 -0
  40. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/async_pool_executor.py +0 -0
  41. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/backup/__init__.py +0 -0
  42. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
  43. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
  44. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
  45. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/backup/grok_async_pool.py +0 -0
  46. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/base_pool_type.py +0 -0
  47. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
  48. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
  49. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
  50. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
  51. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
  52. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
  53. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
  54. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
  55. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
  56. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
  57. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/pool_commons.py +0 -0
  58. {funboost-50.2 → funboost-50.3}/funboost/concurrent_pool/single_thread_executor.py +0 -0
  59. {funboost-50.2 → funboost-50.3}/funboost/constant.py +0 -0
  60. {funboost-50.2 → funboost-50.3}/funboost/consumers/__init__.py +0 -0
  61. {funboost-50.2 → funboost-50.3}/funboost/consumers/celery_consumer.py +0 -0
  62. {funboost-50.2 → funboost-50.3}/funboost/consumers/confirm_mixin.py +0 -0
  63. {funboost-50.2 → funboost-50.3}/funboost/consumers/dramatiq_consumer.py +0 -0
  64. {funboost-50.2 → funboost-50.3}/funboost/consumers/empty_consumer.py +0 -0
  65. {funboost-50.2 → funboost-50.3}/funboost/consumers/faststream_consumer.py +0 -0
  66. {funboost-50.2 → funboost-50.3}/funboost/consumers/http_consumer000.py +0 -0
  67. {funboost-50.2 → funboost-50.3}/funboost/consumers/httpsqs_consumer.py +0 -0
  68. {funboost-50.2 → funboost-50.3}/funboost/consumers/huey_consumer.py +0 -0
  69. {funboost-50.2 → funboost-50.3}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
  70. {funboost-50.2 → funboost-50.3}/funboost/consumers/kombu_consumer.py +0 -0
  71. {funboost-50.2 → funboost-50.3}/funboost/consumers/local_python_queue_consumer.py +0 -0
  72. {funboost-50.2 → funboost-50.3}/funboost/consumers/memory_deque_consumer.py +0 -0
  73. {funboost-50.2 → funboost-50.3}/funboost/consumers/mongomq_consumer.py +0 -0
  74. {funboost-50.2 → funboost-50.3}/funboost/consumers/mqtt_consumer.py +0 -0
  75. {funboost-50.2 → funboost-50.3}/funboost/consumers/mysql_cdc_consumer.py +0 -0
  76. {funboost-50.2 → funboost-50.3}/funboost/consumers/nameko_consumer.py +0 -0
  77. {funboost-50.2 → funboost-50.3}/funboost/consumers/nats_consumer.py +0 -0
  78. {funboost-50.2 → funboost-50.3}/funboost/consumers/nsq_consumer.py +0 -0
  79. {funboost-50.2 → funboost-50.3}/funboost/consumers/peewee_conusmer.py +0 -0
  80. {funboost-50.2 → funboost-50.3}/funboost/consumers/persist_queue_consumer.py +0 -0
  81. {funboost-50.2 → funboost-50.3}/funboost/consumers/pulsar_consumer.py +0 -0
  82. {funboost-50.2 → funboost-50.3}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
  83. {funboost-50.2 → funboost-50.3}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
  84. {funboost-50.2 → funboost-50.3}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
  85. {funboost-50.2 → funboost-50.3}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
  86. {funboost-50.2 → funboost-50.3}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
  87. {funboost-50.2 → funboost-50.3}/funboost/consumers/redis_consumer.py +0 -0
  88. {funboost-50.2 → funboost-50.3}/funboost/consumers/redis_consumer_ack_able.py +0 -0
  89. {funboost-50.2 → funboost-50.3}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
  90. {funboost-50.2 → funboost-50.3}/funboost/consumers/redis_consumer_priority.py +0 -0
  91. {funboost-50.2 → funboost-50.3}/funboost/consumers/redis_consumer_simple.py +0 -0
  92. {funboost-50.2 → funboost-50.3}/funboost/consumers/redis_filter.py +0 -0
  93. {funboost-50.2 → funboost-50.3}/funboost/consumers/redis_pubsub_consumer.py +0 -0
  94. {funboost-50.2 → funboost-50.3}/funboost/consumers/redis_stream_consumer.py +0 -0
  95. {funboost-50.2 → funboost-50.3}/funboost/consumers/rocketmq_consumer.py +0 -0
  96. {funboost-50.2 → funboost-50.3}/funboost/consumers/rq_consumer.py +0 -0
  97. {funboost-50.2 → funboost-50.3}/funboost/consumers/sqlachemy_consumer.py +0 -0
  98. {funboost-50.2 → funboost-50.3}/funboost/consumers/tcp_consumer.py +0 -0
  99. {funboost-50.2 → funboost-50.3}/funboost/consumers/txt_file_consumer.py +0 -0
  100. {funboost-50.2 → funboost-50.3}/funboost/consumers/udp_consumer.py +0 -0
  101. {funboost-50.2 → funboost-50.3}/funboost/consumers/zeromq_consumer.py +0 -0
  102. {funboost-50.2 → funboost-50.3}/funboost/contrib/__init__.py +0 -0
  103. {funboost-50.2 → funboost-50.3}/funboost/contrib/api_publish_msg.py +0 -0
  104. {funboost-50.2 → funboost-50.3}/funboost/contrib/cdc/__init__.py +0 -0
  105. {funboost-50.2 → funboost-50.3}/funboost/contrib/cdc/mysql2mysql.py +0 -0
  106. {funboost-50.2 → funboost-50.3}/funboost/contrib/django_db_deco.py +0 -0
  107. {funboost-50.2 → funboost-50.3}/funboost/contrib/queue2queue.py +0 -0
  108. {funboost-50.2 → funboost-50.3}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
  109. {funboost-50.2 → funboost-50.3}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
  110. {funboost-50.2 → funboost-50.3}/funboost/core/__init__.py +0 -0
  111. {funboost-50.2 → funboost-50.3}/funboost/core/active_cousumer_info_getter.py +0 -0
  112. {funboost-50.2 → funboost-50.3}/funboost/core/cli/__init__.py +0 -0
  113. {funboost-50.2 → funboost-50.3}/funboost/core/cli/discovery_boosters.py +0 -0
  114. {funboost-50.2 → funboost-50.3}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
  115. {funboost-50.2 → funboost-50.3}/funboost/core/cli/funboost_fire.py +0 -0
  116. {funboost-50.2 → funboost-50.3}/funboost/core/current_task.py +0 -0
  117. {funboost-50.2 → funboost-50.3}/funboost/core/exceptions.py +0 -0
  118. {funboost-50.2 → funboost-50.3}/funboost/core/fabric_deploy_helper.py +0 -0
  119. {funboost-50.2 → funboost-50.3}/funboost/core/funboost_config_getter.py +0 -0
  120. {funboost-50.2 → funboost-50.3}/funboost/core/function_result_status_config.py +0 -0
  121. {funboost-50.2 → funboost-50.3}/funboost/core/function_result_status_saver.py +0 -0
  122. {funboost-50.2 → funboost-50.3}/funboost/core/kill_remote_task.py +0 -0
  123. {funboost-50.2 → funboost-50.3}/funboost/core/lazy_impoter.py +0 -0
  124. {funboost-50.2 → funboost-50.3}/funboost/core/loggers.py +0 -0
  125. {funboost-50.2 → funboost-50.3}/funboost/core/muliti_process_enhance.py +0 -0
  126. {funboost-50.2 → funboost-50.3}/funboost/core/serialization.py +0 -0
  127. {funboost-50.2 → funboost-50.3}/funboost/core/task_id_logger.py +0 -0
  128. {funboost-50.2 → funboost-50.3}/funboost/factories/__init__.py +0 -0
  129. {funboost-50.2 → funboost-50.3}/funboost/factories/consumer_factory.py +0 -0
  130. {funboost-50.2 → funboost-50.3}/funboost/factories/publisher_factotry.py +0 -0
  131. {funboost-50.2 → funboost-50.3}/funboost/funboost_config_deafult.py +0 -0
  132. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/__pycache__/app.cpython-313.pyc +0 -0
  133. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
  134. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/__pycache__/app.cpython-39.pyc +0 -0
  135. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/__pycache__/functions.cpython-313.pyc +0 -0
  136. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  137. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
  138. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/app.py +0 -0
  139. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/app_debug_start.py +0 -0
  140. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/functions.py +0 -0
  141. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/assets/css/custom.css +0 -0
  142. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
  143. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
  144. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/assets/js/custom.js +0 -0
  145. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
  146. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css/content_page_style.css +0 -0
  147. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css/style.css +0 -0
  148. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css +0 -0
  149. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/css/font-awesome.min.css +0 -0
  150. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/FontAwesome.otf +0 -0
  151. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.eot +0 -0
  152. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.svg +0 -0
  153. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf +0 -0
  154. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff +0 -0
  155. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2 +0 -0
  156. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/select2/4.0.13/css/select2.min.css +0 -0
  157. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator.min.css +0 -0
  158. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator_bootstrap3.min.css +0 -0
  159. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/css/bootstrap.min.css +0 -0
  160. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.eot +0 -0
  161. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.svg +0 -0
  162. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.ttf +0 -0
  163. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff +0 -0
  164. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff2 +0 -0
  165. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/images/bg.jpg +0 -0
  166. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/images/favicon.ico +0 -0
  167. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/images/password.png +0 -0
  168. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/images/tick.png +0 -0
  169. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/images/user.png +0 -0
  170. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/js/bootstrap-datetimepicker.min.js +0 -0
  171. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/js/echarts.min.js +0 -0
  172. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/js/form-memory.js +0 -0
  173. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
  174. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/js/moment-with-locales.min.js +0 -0
  175. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/js/select2.min.js +0 -0
  176. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/js_cdn/bootstrap/3.3.7/js/bootstrap.min.js +0 -0
  177. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/js_cdn/chart.js +0 -0
  178. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/static/js_cdn/tabulator-tables@5.5.0/dist/js/tabulator.min.js +0 -0
  179. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/about.html +0 -0
  180. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/conusme_speed.html +0 -0
  181. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/fun_result_table.html +0 -0
  182. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/index.html +0 -0
  183. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/index_backup.html +0 -0
  184. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/login.html +0 -0
  185. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/queue_op.html +0 -0
  186. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/rpc_call.html +0 -0
  187. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/running_consumer_by_ip.html +0 -0
  188. {funboost-50.2 → funboost-50.3}/funboost/function_result_web/templates/running_consumer_by_queue_name.html +0 -0
  189. {funboost-50.2 → funboost-50.3}/funboost/publishers/__init__.py +0 -0
  190. {funboost-50.2 → funboost-50.3}/funboost/publishers/celery_publisher.py +0 -0
  191. {funboost-50.2 → funboost-50.3}/funboost/publishers/celery_publisher000.py +0 -0
  192. {funboost-50.2 → funboost-50.3}/funboost/publishers/confluent_kafka_publisher.py +0 -0
  193. {funboost-50.2 → funboost-50.3}/funboost/publishers/dramatiq_publisher.py +0 -0
  194. {funboost-50.2 → funboost-50.3}/funboost/publishers/empty_publisher.py +0 -0
  195. {funboost-50.2 → funboost-50.3}/funboost/publishers/faststream_publisher.py +0 -0
  196. {funboost-50.2 → funboost-50.3}/funboost/publishers/grpc_publisher.py +0 -0
  197. {funboost-50.2 → funboost-50.3}/funboost/publishers/httpsqs_publisher.py +0 -0
  198. {funboost-50.2 → funboost-50.3}/funboost/publishers/huey_publisher.py +0 -0
  199. {funboost-50.2 → funboost-50.3}/funboost/publishers/kafka_publisher.py +0 -0
  200. {funboost-50.2 → funboost-50.3}/funboost/publishers/kombu_publisher.py +0 -0
  201. {funboost-50.2 → funboost-50.3}/funboost/publishers/local_python_queue_publisher.py +0 -0
  202. {funboost-50.2 → funboost-50.3}/funboost/publishers/meomory_deque_publisher.py +0 -0
  203. {funboost-50.2 → funboost-50.3}/funboost/publishers/mongomq_publisher.py +0 -0
  204. {funboost-50.2 → funboost-50.3}/funboost/publishers/mqtt_publisher.py +0 -0
  205. {funboost-50.2 → funboost-50.3}/funboost/publishers/mysql_cdc_publisher.py +0 -0
  206. {funboost-50.2 → funboost-50.3}/funboost/publishers/nameko_publisher.py +0 -0
  207. {funboost-50.2 → funboost-50.3}/funboost/publishers/nats_publisher.py +0 -0
  208. {funboost-50.2 → funboost-50.3}/funboost/publishers/nsq_publisher.py +0 -0
  209. {funboost-50.2 → funboost-50.3}/funboost/publishers/peewee_publisher.py +0 -0
  210. {funboost-50.2 → funboost-50.3}/funboost/publishers/persist_queue_publisher.py +0 -0
  211. {funboost-50.2 → funboost-50.3}/funboost/publishers/pulsar_publisher.py +0 -0
  212. {funboost-50.2 → funboost-50.3}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
  213. {funboost-50.2 → funboost-50.3}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
  214. {funboost-50.2 → funboost-50.3}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
  215. {funboost-50.2 → funboost-50.3}/funboost/publishers/redis_publisher.py +0 -0
  216. {funboost-50.2 → funboost-50.3}/funboost/publishers/redis_publisher_lpush.py +0 -0
  217. {funboost-50.2 → funboost-50.3}/funboost/publishers/redis_publisher_priority.py +0 -0
  218. {funboost-50.2 → funboost-50.3}/funboost/publishers/redis_publisher_simple.py +0 -0
  219. {funboost-50.2 → funboost-50.3}/funboost/publishers/redis_pubsub_publisher.py +0 -0
  220. {funboost-50.2 → funboost-50.3}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
  221. {funboost-50.2 → funboost-50.3}/funboost/publishers/redis_stream_publisher.py +0 -0
  222. {funboost-50.2 → funboost-50.3}/funboost/publishers/rocketmq_publisher.py +0 -0
  223. {funboost-50.2 → funboost-50.3}/funboost/publishers/rq_publisher.py +0 -0
  224. {funboost-50.2 → funboost-50.3}/funboost/publishers/sqla_queue_publisher.py +0 -0
  225. {funboost-50.2 → funboost-50.3}/funboost/publishers/tcp_publisher.py +0 -0
  226. {funboost-50.2 → funboost-50.3}/funboost/publishers/txt_file_publisher.py +0 -0
  227. {funboost-50.2 → funboost-50.3}/funboost/publishers/udp_publisher.py +0 -0
  228. {funboost-50.2 → funboost-50.3}/funboost/publishers/zeromq_publisher.py +0 -0
  229. {funboost-50.2 → funboost-50.3}/funboost/queues/__init__.py +0 -0
  230. {funboost-50.2 → funboost-50.3}/funboost/queues/memory_queues_map.py +0 -0
  231. {funboost-50.2 → funboost-50.3}/funboost/queues/peewee_queue.py +0 -0
  232. {funboost-50.2 → funboost-50.3}/funboost/queues/sqla_queue.py +0 -0
  233. {funboost-50.2 → funboost-50.3}/funboost/set_frame_config.py +0 -0
  234. {funboost-50.2 → funboost-50.3}/funboost/timing_job/__init__.py +0 -0
  235. {funboost-50.2 → funboost-50.3}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
  236. {funboost-50.2 → funboost-50.3}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
  237. {funboost-50.2 → funboost-50.3}/funboost/timing_job/timing_job_base.py +0 -0
  238. {funboost-50.2 → funboost-50.3}/funboost/timing_job/timing_push.py +0 -0
  239. {funboost-50.2 → funboost-50.3}/funboost/utils/__init__.py +0 -0
  240. {funboost-50.2 → funboost-50.3}/funboost/utils/apscheduler_monkey.py +0 -0
  241. {funboost-50.2 → funboost-50.3}/funboost/utils/block_exit.py +0 -0
  242. {funboost-50.2 → funboost-50.3}/funboost/utils/bulk_operation.py +0 -0
  243. {funboost-50.2 → funboost-50.3}/funboost/utils/class_utils.py +0 -0
  244. {funboost-50.2 → funboost-50.3}/funboost/utils/ctrl_c_end.py +0 -0
  245. {funboost-50.2 → funboost-50.3}/funboost/utils/decorators.py +0 -0
  246. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages/__init__.py +0 -0
  247. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
  248. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
  249. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
  250. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
  251. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
  252. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
  253. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
  254. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
  255. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-313.pyc +0 -0
  256. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
  257. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  258. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
  259. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-313.pyc +0 -0
  260. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
  261. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  262. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
  263. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
  264. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
  265. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
  266. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
  267. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
  268. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
  269. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
  270. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
  271. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
  272. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  273. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
  274. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
  275. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
  276. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
  277. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
  278. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
  279. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
  280. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
  281. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
  282. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
  283. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
  284. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
  285. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
  286. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
  287. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
  288. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
  289. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
  290. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
  291. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
  292. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
  293. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
  294. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
  295. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
  296. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
  297. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
  298. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
  299. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
  300. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
  301. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
  302. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
  303. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
  304. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
  305. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
  306. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
  307. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
  308. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
  309. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
  310. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
  311. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
  312. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
  313. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
  314. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
  315. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
  316. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
  317. {funboost-50.2 → funboost-50.3}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
  318. {funboost-50.2 → funboost-50.3}/funboost/utils/develop_log.py +0 -0
  319. {funboost-50.2 → funboost-50.3}/funboost/utils/expire_lock.py +0 -0
  320. {funboost-50.2 → funboost-50.3}/funboost/utils/func_timeout/StoppableThread.py +0 -0
  321. {funboost-50.2 → funboost-50.3}/funboost/utils/func_timeout/__init__.py +0 -0
  322. {funboost-50.2 → funboost-50.3}/funboost/utils/func_timeout/dafunc.py +0 -0
  323. {funboost-50.2 → funboost-50.3}/funboost/utils/func_timeout/exceptions.py +0 -0
  324. {funboost-50.2 → funboost-50.3}/funboost/utils/func_timeout/py2_raise.py +0 -0
  325. {funboost-50.2 → funboost-50.3}/funboost/utils/func_timeout/py3_raise.py +0 -0
  326. {funboost-50.2 → funboost-50.3}/funboost/utils/json_helper.py +0 -0
  327. {funboost-50.2 → funboost-50.3}/funboost/utils/mongo_util.py +0 -0
  328. {funboost-50.2 → funboost-50.3}/funboost/utils/monkey_color_log.py +0 -0
  329. {funboost-50.2 → funboost-50.3}/funboost/utils/monkey_patches.py +0 -0
  330. {funboost-50.2 → funboost-50.3}/funboost/utils/mqtt_util.py +0 -0
  331. {funboost-50.2 → funboost-50.3}/funboost/utils/paramiko_util.py +0 -0
  332. {funboost-50.2 → funboost-50.3}/funboost/utils/rabbitmq_factory.py +0 -0
  333. {funboost-50.2 → funboost-50.3}/funboost/utils/redis_manager.py +0 -0
  334. {funboost-50.2 → funboost-50.3}/funboost/utils/redis_manager_old.py +0 -0
  335. {funboost-50.2 → funboost-50.3}/funboost/utils/resource_monitoring.py +0 -0
  336. {funboost-50.2 → funboost-50.3}/funboost/utils/restart_python.py +0 -0
  337. {funboost-50.2 → funboost-50.3}/funboost/utils/simple_data_class.py +0 -0
  338. {funboost-50.2 → funboost-50.3}/funboost/utils/str_utils.py +0 -0
  339. {funboost-50.2 → funboost-50.3}/funboost/utils/time_util.py +0 -0
  340. {funboost-50.2 → funboost-50.3}/funboost/utils/un_strict_json_dumps.py +0 -0
  341. {funboost-50.2 → funboost-50.3}/funboost.egg-info/dependency_links.txt +0 -0
  342. {funboost-50.2 → funboost-50.3}/funboost.egg-info/entry_points.txt +0 -0
  343. {funboost-50.2 → funboost-50.3}/funboost.egg-info/top_level.txt +0 -0
  344. {funboost-50.2 → funboost-50.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 50.2
3
+ Version: 50.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
@@ -73,7 +73,7 @@ pip install funboost --upgrade
73
73
  `funboost`是`函数增强器,属于轻型自由框架`,你可以对任意项目任意位置的新旧函数加上`@boost`装饰器,是给你函数赋能插上强大翅膀,用户不需要围绕`funboost`或某个中央app实例来组织代码结构,用户函数自身就是一等公民
74
74
 
75
75
  2个框架最显而易见明显差别就是 `funboost` 无需 `@app.boost` 而是直接`@boost`,这个小区别,造成影响深远的框架用法和理念区别.
76
- `funboost`任务控制功能更多,支持broker中间件种类更多,并发方式更多,发布性能超越celery 22倍,消费性能超越 celery 40倍,性能是高几个数量级的断崖式遥遥领先,但反而使用比celery简单得多.
76
+ `funboost`任务控制功能更多,支持broker中间件种类更多,并发方式更多,发布性能超越celery 22倍,消费性能超越 celery 46倍,性能是高几个数量级的断崖式遥遥领先,但反而使用比celery简单得多.
77
77
  ```
78
78
 
79
79
  #### **funboost 支持的并发模式:**
@@ -111,7 +111,7 @@ pip install funboost --upgrade
111
111
  通过`funboost web manager` 管理系统,支持全面 查看 监控 管理 `funboost`的任务消费。
112
112
 
113
113
  #### **funboost的性能超过`celery`一个数量级,不是一个档次上:**
114
- `funboost`发布性能是`celery`的22倍,`funboost`消费性能是`celery`的40倍! 控制变量法对比方式,见文档2.6章节
114
+ `funboost`发布性能是`celery`的22倍,`funboost`消费性能是`celery`的46倍! 控制变量法对比方式,见文档2.6章节
115
115
 
116
116
 
117
117
  #### **funboost框架评价:**
@@ -140,7 +140,7 @@ funboost 框架和一般的框架不一样,因为只有一行代码需要掌
140
140
 
141
141
  只要用过 `funboost` 的用户,都评价比 `celery` 的用法简单几百倍.
142
142
 
143
- 用户可以看文档`6.50`章节,怎么正确的用`ai`大模型掌握`funboost`的用法
143
+ 用户可以看文档`14`章节,怎么正确的用`ai`大模型掌握`funboost`的用法
144
144
  ```
145
145
 
146
146
  [**1.python万能分布式函数调度框架简funboost简介**](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
@@ -644,7 +644,7 @@ python比其他语言更需要分布式函数调度框架来执行函数,有
644
644
  大部分框架,都要深入使用里面的很多个类,还需要继承组合一顿。
645
645
  ```
646
646
 
647
- 用户也可以按照 文档6.50的方式,使用ai来掌握`funboost`
647
+ 用户也可以按照 文档14章节的方式,使用ai来掌握`funboost`
648
648
 
649
649
  ## 1.6 funboost支持支持celery框架整体作为funboost的broker (2023.4新增)
650
650
 
@@ -38,7 +38,7 @@ pip install funboost --upgrade
38
38
  `funboost`是`函数增强器,属于轻型自由框架`,你可以对任意项目任意位置的新旧函数加上`@boost`装饰器,是给你函数赋能插上强大翅膀,用户不需要围绕`funboost`或某个中央app实例来组织代码结构,用户函数自身就是一等公民
39
39
 
40
40
  2个框架最显而易见明显差别就是 `funboost` 无需 `@app.boost` 而是直接`@boost`,这个小区别,造成影响深远的框架用法和理念区别.
41
- `funboost`任务控制功能更多,支持broker中间件种类更多,并发方式更多,发布性能超越celery 22倍,消费性能超越 celery 40倍,性能是高几个数量级的断崖式遥遥领先,但反而使用比celery简单得多.
41
+ `funboost`任务控制功能更多,支持broker中间件种类更多,并发方式更多,发布性能超越celery 22倍,消费性能超越 celery 46倍,性能是高几个数量级的断崖式遥遥领先,但反而使用比celery简单得多.
42
42
  ```
43
43
 
44
44
  #### **funboost 支持的并发模式:**
@@ -76,7 +76,7 @@ pip install funboost --upgrade
76
76
  通过`funboost web manager` 管理系统,支持全面 查看 监控 管理 `funboost`的任务消费。
77
77
 
78
78
  #### **funboost的性能超过`celery`一个数量级,不是一个档次上:**
79
- `funboost`发布性能是`celery`的22倍,`funboost`消费性能是`celery`的40倍! 控制变量法对比方式,见文档2.6章节
79
+ `funboost`发布性能是`celery`的22倍,`funboost`消费性能是`celery`的46倍! 控制变量法对比方式,见文档2.6章节
80
80
 
81
81
 
82
82
  #### **funboost框架评价:**
@@ -105,7 +105,7 @@ funboost 框架和一般的框架不一样,因为只有一行代码需要掌
105
105
 
106
106
  只要用过 `funboost` 的用户,都评价比 `celery` 的用法简单几百倍.
107
107
 
108
- 用户可以看文档`6.50`章节,怎么正确的用`ai`大模型掌握`funboost`的用法
108
+ 用户可以看文档`14`章节,怎么正确的用`ai`大模型掌握`funboost`的用法
109
109
  ```
110
110
 
111
111
  [**1.python万能分布式函数调度框架简funboost简介**](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
@@ -609,7 +609,7 @@ python比其他语言更需要分布式函数调度框架来执行函数,有
609
609
  大部分框架,都要深入使用里面的很多个类,还需要继承组合一顿。
610
610
  ```
611
611
 
612
- 用户也可以按照 文档6.50的方式,使用ai来掌握`funboost`
612
+ 用户也可以按照 文档14章节的方式,使用ai来掌握`funboost`
613
613
 
614
614
  ## 1.6 funboost支持支持celery框架整体作为funboost的broker (2023.4新增)
615
615
 
@@ -13,7 +13,7 @@ set_frame_config这个模块的 use_config_form_funboost_config_module() 是核
13
13
  这段注释说明和使用的用户无关,只和框架开发人员有关.
14
14
  '''
15
15
 
16
- __version__ = "50.2"
16
+ __version__ = "50.3"
17
17
 
18
18
  from funboost.set_frame_config import show_frame_config
19
19
 
@@ -639,6 +639,9 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
639
639
  def _frame_custom_record_process_info_func(self,current_function_result_status: FunctionResultStatus,kw:dict):
640
640
  pass
641
641
 
642
+ async def _aio_frame_custom_record_process_info_func(self,current_function_result_status: FunctionResultStatus,kw:dict):
643
+ pass
644
+
642
645
  def user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus,): # 这个可以继承
643
646
  pass
644
647
 
@@ -921,6 +924,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
921
924
  self.metric_calculation.cal(t_start_run_fun, current_function_result_status)
922
925
 
923
926
  self._frame_custom_record_process_info_func(current_function_result_status,kw)
927
+ await self._aio_frame_custom_record_process_info_func(current_function_result_status,kw)
924
928
  self.user_custom_record_process_info_func(current_function_result_status,) # 两种方式都可以自定义,记录结果.建议使用文档4.21.b的方式继承来重写
925
929
  await self.aio_user_custom_record_process_info_func(current_function_result_status,)
926
930
  if self.consumer_params.user_custom_record_process_info_func:
@@ -10,29 +10,12 @@ import time
10
10
  from funboost import FunctionResultStatus
11
11
  from funboost.assist.grpc_helper import funboost_grpc_pb2_grpc, funboost_grpc_pb2
12
12
  from funboost.consumers.base_consumer import AbstractConsumer
13
+ from funboost.core.msg_result_getter import FutureStatusResult
13
14
  from funboost.core.serialization import Serialization
14
15
  from funboost.core.exceptions import FunboostWaitRpcResultTimeout
15
16
  from funboost.concurrent_pool.flexible_thread_pool import FlexibleThreadPool
16
17
 
17
18
 
18
- class FutureStatusResult:
19
- def __init__(self,call_type:str):
20
- self.execute_finish_event = threading.Event()
21
- self.staus_result_obj: FunctionResultStatus = None
22
- self.call_type = call_type # sync_call or publish
23
-
24
- def set_finish(self):
25
- self.execute_finish_event.set()
26
-
27
- def wait_finish(self,rpc_timeout):
28
- return self.execute_finish_event.wait(rpc_timeout)
29
-
30
- def set_staus_result_obj(self, staus_result_obj:FunctionResultStatus):
31
- self.staus_result_obj = staus_result_obj
32
-
33
- def get_staus_result_obj(self):
34
- return self.staus_result_obj
35
-
36
19
 
37
20
 
38
21
 
@@ -0,0 +1,138 @@
1
+ # -*- coding: utf-8 -*-
2
+ # @Author : ydf
3
+ # @Time : 2022/8/8 0008 13:32
4
+ import logging
5
+ import threading
6
+
7
+
8
+ from flask import Flask, request
9
+
10
+ from funboost.consumers.base_consumer import AbstractConsumer
11
+ from funboost.core.function_result_status_saver import FunctionResultStatus
12
+ from funboost.core.msg_result_getter import FutureStatusResult
13
+ from funboost.core.serialization import Serialization
14
+
15
+
16
+
17
+
18
+ class HTTPConsumer(AbstractConsumer, ):
19
+ """
20
+ flask 作为消息队列实现 consumer
21
+ """
22
+ BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'host': '127.0.0.1', 'port': None}
23
+
24
+ # noinspection PyAttributeOutsideInit
25
+ def custom_init(self):
26
+ # try:
27
+ # self._ip, self._port = self.queue_name.split(':')
28
+ # self._port = int(self._port)
29
+ # except BaseException as e:
30
+ # self.logger.critical(f'http作为消息队列时候,队列名字必须设置为 例如 192.168.1.101:8200 这种, ip:port')
31
+ # raise e
32
+ self._ip = self.consumer_params.broker_exclusive_config['host']
33
+ self._port = self.consumer_params.broker_exclusive_config['port']
34
+ if self._port is None:
35
+ raise ValueError('please specify port')
36
+
37
+ def _shedual_task(self):
38
+ """
39
+ 使用Flask实现HTTP服务器
40
+ 相比aiohttp,Flask是同步框架,避免了异步阻塞问题
41
+ """
42
+
43
+
44
+ # 创建Flask应用
45
+ flask_app = Flask(__name__)
46
+ # 关闭Flask的日志,避免干扰funboost的日志
47
+ flask_app.logger.disabled = True
48
+ logging.getLogger('werkzeug').disabled = True
49
+
50
+ @flask_app.route('/', methods=['GET'])
51
+ def hello():
52
+ """健康检查接口"""
53
+ return "Hello, from funboost (Flask version)"
54
+
55
+ @flask_app.route('/queue', methods=['POST'])
56
+ def recv_msg():
57
+ """
58
+ 接收消息的核心接口
59
+ 支持两种调用类型:
60
+ 1. publish: 异步发布,立即返回
61
+ 2. sync_call: 同步调用,等待结果返回
62
+ """
63
+ try:
64
+ # 获取请求数据
65
+ msg = request.form.get('msg')
66
+ call_type = request.form.get('call_type', 'publish')
67
+
68
+ if not msg:
69
+ return {"error": "msg parameter is required"}, 400
70
+
71
+ # 构造消息数据
72
+ kw = {
73
+ 'body': msg,
74
+ 'call_type': call_type,
75
+ }
76
+
77
+ if call_type == 'sync_call':
78
+ # 同步调用:需要等待执行结果
79
+ future_status_result = FutureStatusResult(call_type=call_type)
80
+ kw['future_status_result'] = future_status_result
81
+
82
+ # 提交任务到线程池执行
83
+ self._submit_task(kw)
84
+
85
+ # 等待任务完成(带超时)
86
+ if future_status_result.wait_finish(self.consumer_params.rpc_timeout):
87
+ # 返回执行结果
88
+ result = future_status_result.get_staus_result_obj()
89
+ return Serialization.to_json_str(
90
+ result.get_status_dict(without_datetime_obj=True)
91
+ )
92
+ else:
93
+ # 超时处理
94
+ self.logger.error(f'sync_call wait timeout after {self.consumer_params.rpc_timeout}s')
95
+ return {"error": "execution timeout"}, 408
96
+
97
+ else:
98
+ # 异步发布:直接提交任务,立即返回
99
+ self._submit_task(kw)
100
+ return "finish"
101
+
102
+ except Exception as e:
103
+ self.logger.error(f'处理HTTP请求时出错: {e}', exc_info=True)
104
+ return {"error": str(e)}, 500
105
+
106
+ # 启动Flask服务器
107
+ # 注意:Flask默认是单线程的,但funboost使用线程池处理任务,所以这里threaded=True
108
+ self.logger.info(f'启动Flask HTTP服务器,监听 {self._ip}:{self._port}')
109
+
110
+ # flask_app.run(
111
+ # host='0.0.0.0', # 监听所有接口
112
+ # port=self._port,
113
+ # debug=False, # 生产环境关闭debug
114
+ # threaded=True, # 开启多线程支持
115
+ # use_reloader=False, # 关闭自动重载
116
+ # )
117
+
118
+ import waitress
119
+ waitress.serve(flask_app, host='0.0.0.0', port=self._port,threads=self.consumer_params.concurrent_num)
120
+
121
+ def _frame_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus, kw: dict):
122
+ """
123
+ 任务执行完成后的回调函数
124
+ 对于sync_call模式,需要通知等待的HTTP请求
125
+ """
126
+ if kw['call_type'] == "sync_call":
127
+ future_status_result: FutureStatusResult = kw['future_status_result']
128
+ future_status_result.set_staus_result_obj(current_function_result_status)
129
+ future_status_result.set_finish()
130
+ # self.logger.info('sync_call任务执行完成,通知HTTP请求返回结果')
131
+
132
+ def _confirm_consume(self, kw):
133
+ """HTTP模式没有确认消费的功能"""
134
+ pass
135
+
136
+ def _requeue(self, kw):
137
+ """HTTP模式没有重新入队的功能"""
138
+ pass
@@ -0,0 +1,113 @@
1
+ # -*- coding: utf-8 -*-
2
+ # @Author : ydf
3
+ # @Time : 2022/8/8 0008 13:32
4
+ import asyncio
5
+ import json
6
+
7
+ # from aiohttp import web
8
+ # from aiohttp.web_request import Request
9
+
10
+ from funboost.consumers.base_consumer import AbstractConsumer
11
+ from funboost.core.function_result_status_saver import FunctionResultStatus
12
+ from funboost.core.lazy_impoter import AioHttpImporter
13
+ from funboost.core.serialization import Serialization
14
+
15
+
16
+ class AioFutureStatusResult:
17
+ def __init__(self,call_type:str):
18
+ self.execute_finish_event = asyncio.Event()
19
+ self.staus_result_obj: FunctionResultStatus = None
20
+ self.call_type = call_type # sync_call or publish
21
+
22
+ def set_finish(self):
23
+ self.execute_finish_event.set()
24
+
25
+ async def wait_finish(self,rpc_timeout):
26
+ return await self.execute_finish_event.wait()
27
+
28
+ def set_staus_result_obj(self, staus_result_obj:FunctionResultStatus):
29
+ self.staus_result_obj = staus_result_obj
30
+
31
+ def get_staus_result_obj(self):
32
+ return self.staus_result_obj
33
+
34
+ class HTTPConsumer(AbstractConsumer, ):
35
+ """
36
+ aiohttp 实现消息队列,不支持持久化,但不需要安装软件。
37
+ """
38
+ BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'host': '127.0.0.1', 'port': None}
39
+
40
+ # noinspection PyAttributeOutsideInit
41
+ def custom_init(self):
42
+ # try:
43
+ # self._ip, self._port = self.queue_name.split(':')
44
+ # self._port = int(self._port)
45
+ # except BaseException as e:
46
+ # self.logger.critical(f'http作为消息队列时候,队列名字必须设置为 例如 192.168.1.101:8200 这种, ip:port')
47
+ # raise e
48
+ self._ip = self.consumer_params.broker_exclusive_config['host']
49
+ self._port = self.consumer_params.broker_exclusive_config['port']
50
+ if self._port is None:
51
+ raise ValueError('please specify port')
52
+
53
+ # noinspection DuplicatedCode
54
+ def _shedual_task(self):
55
+ # flask_app = Flask(__name__)
56
+ #
57
+ # @flask_app.route('/queue', methods=['post'])
58
+ # def recv_msg():
59
+ # msg = request.form['msg']
60
+ # kw = {'body': json.loads(msg)}
61
+ # self._submit_task(kw)
62
+ # return 'finish'
63
+ #
64
+ # flask_app.run('0.0.0.0', port=self._port,debug=False)
65
+
66
+ routes = AioHttpImporter().web.RouteTableDef()
67
+
68
+ # noinspection PyUnusedLocal
69
+ @routes.get('/')
70
+ async def hello(request):
71
+ return AioHttpImporter().web.Response(text="Hello, from funboost")
72
+
73
+ @routes.post('/queue')
74
+ async def recv_msg(request: AioHttpImporter().Request):
75
+ data = await request.post()
76
+ msg = data['msg']
77
+ call_type = data['call_type']
78
+ kw = {'body': msg,'call_type': call_type,}
79
+ if call_type == 'sync_call':
80
+ aio_future_status_result = AioFutureStatusResult(call_type=call_type)
81
+ kw['aio_future_status_result'] = aio_future_status_result
82
+ self._submit_task(kw)
83
+ if data['call_type'] == 'sync_call':
84
+ await aio_future_status_result.wait_finish(self.consumer_params.rpc_timeout)
85
+ return AioHttpImporter().web.Response(text=Serialization.to_json_str(
86
+ aio_future_status_result.get_staus_result_obj().get_status_dict(without_datetime_obj=True)))
87
+ return AioHttpImporter().web.Response(text="finish")
88
+
89
+ app = AioHttpImporter().web.Application()
90
+ app.add_routes(routes)
91
+ loop = asyncio.new_event_loop()
92
+ asyncio.set_event_loop(loop)
93
+ AioHttpImporter().web.run_app(app, host='0.0.0.0', port=self._port, )
94
+
95
+ def _frame_custom_record_process_info_func(self,current_function_result_status: FunctionResultStatus,kw:dict):
96
+ if kw['call_type'] == "sync_call":
97
+ aio_future_status_result: AioFutureStatusResult = kw['aio_future_status_result']
98
+ aio_future_status_result.set_staus_result_obj(current_function_result_status)
99
+ aio_future_status_result.set_finish()
100
+ self.logger.info(f'aio_future_status_result.set_finish()')
101
+
102
+ # async def _aio_frame_custom_record_process_info_func(self,current_function_result_status: FunctionResultStatus,kw:dict):
103
+ # self.logger.info(666666)
104
+ # if kw['call_type'] == "sync_call":
105
+ # aio_future_status_result: AioFutureStatusResult = kw['aio_future_status_result']
106
+ # aio_future_status_result.set_staus_result_obj(current_function_result_status)
107
+ # aio_future_status_result.set_finish()
108
+ # self.logger.info(f'aio_future_status_result.set_finish()')
109
+ def _confirm_consume(self, kw):
110
+ pass # 没有确认消费的功能。
111
+
112
+ def _requeue(self, kw):
113
+ pass
@@ -60,10 +60,7 @@ class KafkaConsumer(AbstractConsumer):
60
60
  # REMIND 好处是并发高。topic像翻书一样,随时可以设置偏移量重新消费。多个分组消费同一个主题,每个分组对相同主题的偏移量互不干扰 。
61
61
  for message in consumer:
62
62
  # 注意: message ,value都是原始的字节数据,需要decode
63
- if self.consumer_params.is_show_message_get_from_broker:
64
- self.logger.debug(
65
- f'从kafka的 [{message.topic}] 主题,分区 {message.partition} 中 取出的消息是: {message.value.decode()}')
66
- kw = {'consumer': consumer, 'message': message, 'body': message.value}
63
+ kw = {'consumer': consumer, 'message': message, 'body': message.value.decode('utf-8')}
67
64
  self._submit_task(kw)
68
65
 
69
66
  def _confirm_consume(self, kw):
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
  import copy
3
3
  import inspect
4
+ from multiprocessing import Process
4
5
  import os
5
6
  import sys
6
7
  import types
@@ -242,10 +243,10 @@ class BoostersManager:
242
243
  """
243
244
 
244
245
  # pid_queue_name__booster_map字典存放 {(进程id,queue_name):Booster对象}
245
- pid_queue_name__booster_map = {} # type: typing.Dict[typing.Tuple[int,str],Booster]
246
+ pid_queue_name__booster_map :typing.Dict[typing.Tuple[int,str],Booster]= {}
246
247
 
247
248
  # queue_name__boost_params_consuming_function_map 字典存放 {queue_name,(@boost的入参字典,@boost装饰的消费函数)}
248
- queue_name__boost_params_map = {} # type: typing.Dict[str,BoosterParams]
249
+ queue_name__boost_params_map :typing.Dict[str,BoosterParams]= {}
249
250
 
250
251
  pid_queue_name__has_start_consume_set = set()
251
252
 
@@ -392,6 +393,34 @@ class BoostersManager:
392
393
 
393
394
  m_consume = multi_process_consume_queues
394
395
 
396
+ @classmethod
397
+ def consume_group(cls, booster_group:str,block=False):
398
+ """
399
+ 根据@boost装饰器的 booster_group消费分组名字,启动多个消费函数;
400
+ """
401
+ if booster_group is None:
402
+ raise ValueError('booster_group 不能为None')
403
+ need_consume_queue_names = []
404
+ for queue_name in cls.get_all_queues():
405
+ booster= cls.get_or_create_booster_by_queue_name(queue_name)
406
+ if booster.boost_params.booster_group == booster_group:
407
+ need_consume_queue_names.append(queue_name)
408
+ flogger.info(f'according to booster_group:{booster_group} ,start consume queues: {need_consume_queue_names}')
409
+ for queue_name in need_consume_queue_names:
410
+ cls.get_or_create_booster_by_queue_name(queue_name).consume()
411
+ if block:
412
+ ctrl_c_recv()
413
+
414
+ @classmethod
415
+ def multi_process_consume_group(cls, booster_group:str, process_num=1):
416
+ """
417
+ 根据@boost装饰器的 booster_group消费分组名字,启动多个消费函数;
418
+ """
419
+ for _ in range(process_num):
420
+ Process(target=cls.consume_group,args=(booster_group,True)).start()
421
+
422
+ m_consume_group = multi_process_consume_group
423
+
395
424
  @classmethod
396
425
  def multi_process_consume_all_queues(cls, process_num=1):
397
426
  """
@@ -0,0 +1,130 @@
1
+ import pytz
2
+ import time
3
+ import sys
4
+ import datetime
5
+
6
+ import typing
7
+ import threading
8
+ from nb_time import NbTime
9
+ from funboost.funboost_config_deafult import FunboostCommonConfig
10
+
11
+
12
+ class FunboostTime(NbTime):
13
+ default_formatter = NbTime.FORMATTER_DATETIME_NO_ZONE
14
+
15
+ def get_time_zone_str(self, time_zone: typing.Union[str, datetime.tzinfo, None] = None):
16
+ return time_zone or self.default_time_zone or FunboostCommonConfig.TIMEZONE or self.get_localzone_name()
17
+
18
+ @staticmethod
19
+ def _get_tow_digist(num: int) -> str:
20
+ if len(str(num)) == 1:
21
+ return f'0{num}'
22
+ return str(num)
23
+
24
+ def get_str(self, formatter=None):
25
+ return self.datetime_obj.strftime(formatter or self.datetime_formatter)
26
+
27
+ def get_str_fast(self):
28
+ t_str = f'{self.datetime_obj.year}-{self._get_tow_digist(self.datetime_obj.month)}-{self._get_tow_digist(self.datetime_obj.day)} {self._get_tow_digist(self.datetime_obj.hour)}:{self._get_tow_digist(self.datetime_obj.minute)}:{self._get_tow_digist(self.datetime_obj.second)}'
29
+ return t_str
30
+
31
+
32
+ # 缓存时区对象,提升性能(避免重复解析)
33
+ _tz_cache = {}
34
+
35
+ _DIGIT_MAP = {i: f'{i:02d}' for i in range(100)}
36
+
37
+
38
+ def _gen_2_dig_number(n):
39
+ return _DIGIT_MAP[n]
40
+
41
+
42
+ def get_now_time_str_by_tz(tz_name: str = None) -> str:
43
+ # 生成100万次当前时间字符串%Y-%m-%d %H:%M:%S仅需1.9秒.
44
+ """
45
+ 根据时区名(如 'Asia/Shanghai')返回当前时间字符串,格式:'%Y-%m-%d %H:%M:%S'
46
+
47
+ 兼容 Python 3.6+,优先使用 zoneinfo(3.9+),否则尝试 pytz
48
+
49
+ :param tz_name: IANA 时区名称,如 'Asia/Shanghai', 'America/New_York'
50
+ :return: 格式化时间字符串
51
+ """
52
+ # 检查缓存
53
+ tz_name = tz_name or FunboostCommonConfig.TIMEZONE
54
+ if tz_name not in _tz_cache:
55
+ if sys.version_info >= (3, 9):
56
+ from zoneinfo import ZoneInfo
57
+ _tz_cache[tz_name] = ZoneInfo(tz_name)
58
+ else:
59
+ # Python < 3.9,使用 pytz
60
+ _tz_cache[tz_name] = pytz.timezone(tz_name)
61
+
62
+
63
+ tz = _tz_cache[tz_name]
64
+
65
+ # 获取当前时间并格式化(注意:datetime.now(tz) 是最高效的方式)
66
+ now = datetime.datetime.now(tz)
67
+ # return f'{now.year:04d}-{now.month:02d}-{now.day:02d} {now.hour:02d}:{now.minute:02d}:{now.second:02d}'
68
+ # return now.strftime("%Y-%m-%d %H:%M:%S")
69
+ return f'{now.year}-{_gen_2_dig_number(now.month)}-{_gen_2_dig_number(now.day)} {_gen_2_dig_number(now.hour)}:{_gen_2_dig_number(now.minute)}:{_gen_2_dig_number(now.second)}'
70
+
71
+
72
+ class NowTimeStrCache:
73
+ # 生成100万次当前时间字符串%Y-%m-%d %H:%M:%S仅需0.4秒.
74
+ # 全局变量,用于存储缓存的时间字符串和对应的整秒时间戳
75
+ _cached_time_str: typing.Optional[str] = None
76
+ _cached_time_second: int = 0
77
+
78
+ # 为了线程安全,使用锁。在极高并发下,锁的开销远小于每毫秒都进行时间格式化。
79
+ _time_cache_lock = threading.Lock()
80
+
81
+ @classmethod
82
+ def fast_get_now_time_str(cls,timezone_str:str=None) -> str:
83
+ """
84
+ 获取当前时间字符串,格式为 '%Y-%m-%d %H:%M:%S'。
85
+ 通过缓存机制,同一秒内的多次调用直接返回缓存结果,极大提升性能。
86
+ 适用于对时间精度要求不高(秒级即可)的高并发场景。
87
+ :return: 格式化后的时间字符串,例如 '2024-06-12 15:30:45'
88
+ """
89
+ timezone_str = timezone_str or FunboostCommonConfig.TIMEZONE
90
+
91
+ # 获取当前的整秒时间戳(去掉小数部分)
92
+ current_second = int(time.time())
93
+
94
+ # 如果缓存的时间戳与当前秒数一致,直接返回缓存的字符串。
95
+ if current_second == cls._cached_time_second:
96
+ return cls._cached_time_str
97
+
98
+ # 如果不一致,说明进入新的一秒,需要重新计算并更新缓存。
99
+ # 使用锁确保在多线程环境下,只有一个线程会执行更新操作。
100
+
101
+ with cls._time_cache_lock:
102
+ # 双重检查锁定 (Double-Checked Locking),防止在等待锁的过程中,其他线程已经更新了缓存。
103
+ if current_second == cls._cached_time_second:
104
+ return cls._cached_time_str
105
+
106
+ # 重新计算时间字符串。这里直接使用 time.strftime,因为它在秒级更新的场景下性能足够。
107
+ # 我们不需要像 Funboost 那样为每一毫秒的调用都去做查表优化。
108
+ now = datetime.datetime.now(tz=pytz.timezone(timezone_str))
109
+ cls._cached_time_str = now.strftime('%Y-%m-%d %H:%M:%S', )
110
+ cls._cached_time_second = current_second
111
+
112
+ return cls._cached_time_str
113
+
114
+
115
+ if __name__ == '__main__':
116
+ print(FunboostTime().get_str())
117
+ tz = pytz.timezone(FunboostCommonConfig.TIMEZONE)
118
+ for i in range(1000000):
119
+ pass
120
+ # FunboostTime()#.get_str_fast()
121
+
122
+ # datetime.datetime.now().strftime(NbTime.FORMATTER_DATETIME_NO_ZONE)
123
+ tz = pytz.timezone(FunboostCommonConfig.TIMEZONE)
124
+ datetime.datetime.now(tz=tz)
125
+ # datetime.datetime.now(tz=pytz.timezone(FunboostCommonConfig.TIMEZONE))#.strftime(NbTime.FORMATTER_DATETIME_NO_ZONE)
126
+ # datetime.datetime.now(tz=pytz.timezone(FunboostCommonConfig.TIMEZONE)).timestamp()
127
+
128
+ # time.strftime(NbTime.FORMATTER_DATETIME_NO_ZONE)
129
+ # time.time()
130
+ print(NbTime())
@@ -201,12 +201,17 @@ class BoosterParams(BaseJsonAbleModel):
201
201
  schedule_tasks_on_main_thread: bool = False # 直接在主线程调度任务,意味着不能直接在当前主线程同时开启两个消费者。
202
202
 
203
203
  is_auto_start_consuming_message: bool = False # 是否在定义后就自动启动消费,无需用户手动写 .consume() 来启动消息消费。
204
+
205
+ # booster_group :消费分组名字, BoostersManager.consume_group 时候根据 booster_group 启动多个消费函数,减少需要写 f1.consume() f2.consume() ...这种。
206
+ # 不像BoostersManager.consume_all() 会启动所有不相关消费函数,也不像 f1.consume() f2.consume() 这样需要逐个启动消费函数。
207
+ # 可以根据业务逻辑创建不同的分组,实现灵活的消费启动策略。
208
+ # 用法见文档 4.2d.3 章节. 使用 BoostersManager ,通过 consume_group 启动一组消费函数
209
+ booster_group:typing.Union[str, None] = None
204
210
 
205
211
  consuming_function: typing.Optional[typing.Callable] = None # 消费函数,在@boost时候不用指定,因为装饰器知道下面的函数.
206
212
  consuming_function_raw: typing.Optional[typing.Callable] = None # 不需要传递,自动生成
207
213
  consuming_function_name: str = '' # 不需要传递,自动生成
208
214
 
209
-
210
215
 
211
216
  broker_exclusive_config: dict = {} # 加上一个不同种类中间件非通用的配置,不同中间件自身独有的配置,不是所有中间件都兼容的配置,因为框架支持30种消息队列,消息队列不仅仅是一般的先进先出queue这么简单的概念,
212
217
  # 例如kafka支持消费者组,rabbitmq也支持各种独特概念例如各种ack机制 复杂路由机制,有的中间件原生能支持消息优先级有的中间件不支持,每一种消息队列都有独特的配置参数意义,可以通过这里传递。每种中间件能传递的键值对可以看consumer类的 BROKER_EXCLUSIVE_CONFIG_DEFAULT
@@ -228,9 +233,20 @@ class BoosterParams(BaseJsonAbleModel):
228
233
  COMMON_FUNCTION = 'COMMON_FUNCTION'
229
234
  """
230
235
 
236
+ """
237
+ user_options:
238
+ 用户额外自定义的配置,高级用户或者奇葩需求可以用得到,用户可以自由发挥,存放任何设置.
239
+ user_options 提供了一个统一的、用户自定义的命名空间,让用户可以为自己的“奇葩需求”或“高级定制”传递配置,而无需等待框架开发者添加官方支持。
240
+ funboost 是自由框架不是奴役框架,不仅消费函数逻辑自由,目录层级结构自由,自定义奇葩扩展也要追求自由,用户不用改funboost BoosterParams 源码来加装饰器参数
241
+
242
+ 使用场景见文档 4b.6 章节.
243
+ """
244
+ user_options: dict = {} # 用户自定义的配置,高级用户或者奇葩需求可以用得到,用户可以自由发挥,存放任何设置.
245
+
246
+
231
247
  auto_generate_info: dict = {} # 自动生成的信息,不需要用户主动传参.
232
-
233
-
248
+
249
+
234
250
 
235
251
  @root_validator(skip_on_failure=True, )
236
252
  def check_values(cls, values: dict):
@@ -358,6 +374,8 @@ class PublisherParams(BaseJsonAbleModel):
358
374
  publish_msg_log_use_full_msg: bool = False # 发布到消息队列的消息内容的日志,是否显示消息的完整体,还是只显示函数入参。
359
375
  consuming_function_kind: typing.Optional[str] = None # 自动生成的信息,不需要用户主动传参.
360
376
  rpc_timeout: int = 1800 # rpc模式下,等待rpc结果返回的超时时间
377
+ user_options: dict = {} # 用户自定义的配置,高级用户或者奇葩需求可以用得到,用户可以自由发挥,存放任何设置.
378
+
361
379
 
362
380
  if __name__ == '__main__':
363
381
  from funboost.concurrent_pool import FlexibleThreadPool