funboost 49.7__tar.gz → 49.9__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 (349) hide show
  1. {funboost-49.7/funboost.egg-info → funboost-49.9}/PKG-INFO +69 -33
  2. {funboost-49.7 → funboost-49.9}/README.md +60 -32
  3. {funboost-49.7 → funboost-49.9}/funboost/__init__.py +1 -1
  4. {funboost-49.7 → funboost-49.9}/funboost/assist/celery_helper.py +1 -1
  5. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/async_pool_executor.py +23 -17
  6. {funboost-49.7 → funboost-49.9}/funboost/constant.py +23 -0
  7. {funboost-49.7 → funboost-49.9}/funboost/consumers/base_consumer.py +15 -8
  8. funboost-49.9/funboost/consumers/grpc_consumer.py +102 -0
  9. {funboost-49.7 → funboost-49.9}/funboost/consumers/kafka_consumer.py +4 -2
  10. {funboost-49.7 → funboost-49.9}/funboost/consumers/kafka_consumer_manually_commit.py +7 -2
  11. funboost-49.9/funboost/consumers/mysql_cdc_consumer.py +95 -0
  12. funboost-49.9/funboost/contrib/cdc/mysql2mysql.py +44 -0
  13. {funboost-49.7 → funboost-49.9}/funboost/core/booster.py +25 -2
  14. {funboost-49.7 → funboost-49.9}/funboost/core/exceptions.py +3 -0
  15. {funboost-49.7 → funboost-49.9}/funboost/core/func_params_model.py +7 -4
  16. {funboost-49.7 → funboost-49.9}/funboost/core/msg_result_getter.py +8 -7
  17. {funboost-49.7 → funboost-49.9}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +10 -1
  18. {funboost-49.7 → funboost-49.9}/funboost/publishers/base_publisher.py +5 -6
  19. funboost-49.9/funboost/publishers/grpc_publisher.py +53 -0
  20. {funboost-49.7 → funboost-49.9}/funboost/publishers/kafka_publisher.py +3 -1
  21. funboost-49.9/funboost/publishers/mysql_cdc_publisher.py +24 -0
  22. {funboost-49.7 → funboost-49.9}/funboost/timing_job/timing_push.py +3 -1
  23. funboost-49.9/funboost/utils/func_timeout/__init__.py +0 -0
  24. {funboost-49.7 → funboost-49.9/funboost.egg-info}/PKG-INFO +69 -33
  25. {funboost-49.7 → funboost-49.9}/funboost.egg-info/SOURCES.txt +7 -10
  26. {funboost-49.7 → funboost-49.9}/funboost.egg-info/requires.txt +8 -0
  27. {funboost-49.7 → funboost-49.9}/setup.py +6 -0
  28. funboost-49.7/funboost/utils/class_utils2.py +0 -94
  29. funboost-49.7/funboost/utils/custom_pysnooper.py +0 -149
  30. funboost-49.7/funboost/utils/pysnooper_ydf/__init__.py +0 -32
  31. funboost-49.7/funboost/utils/pysnooper_ydf/pycompat.py +0 -82
  32. funboost-49.7/funboost/utils/pysnooper_ydf/tracer.py +0 -479
  33. funboost-49.7/funboost/utils/pysnooper_ydf/utils.py +0 -101
  34. funboost-49.7/funboost/utils/pysnooper_ydf/variables.py +0 -133
  35. funboost-49.7/funboost/utils/times/__init__.py +0 -85
  36. funboost-49.7/funboost/utils/times/version.py +0 -1
  37. {funboost-49.7 → funboost-49.9}/LICENSE +0 -0
  38. {funboost-49.7 → funboost-49.9}/MANIFEST.in +0 -0
  39. {funboost-49.7 → funboost-49.9}/funboost/__init__old.py +0 -0
  40. {funboost-49.7 → funboost-49.9}/funboost/__main__.py +0 -0
  41. {funboost-49.7 → funboost-49.9}/funboost/assist/__init__.py +0 -0
  42. {funboost-49.7 → funboost-49.9}/funboost/assist/dramatiq_helper.py +0 -0
  43. {funboost-49.7 → funboost-49.9}/funboost/assist/faststream_helper.py +0 -0
  44. {funboost-49.7 → funboost-49.9}/funboost/assist/huey_helper.py +0 -0
  45. {funboost-49.7 → funboost-49.9}/funboost/assist/rocketry_helper.py +0 -0
  46. {funboost-49.7 → funboost-49.9}/funboost/assist/rq_helper.py +0 -0
  47. {funboost-49.7 → funboost-49.9}/funboost/assist/rq_windows_worker.py +0 -0
  48. {funboost-49.7 → funboost-49.9}/funboost/assist/taskiq_helper.py +0 -0
  49. {funboost-49.7 → funboost-49.9}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
  50. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/__init__.py +0 -0
  51. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/async_helper.py +0 -0
  52. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/backup/__init__.py +0 -0
  53. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
  54. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
  55. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
  56. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/backup/grok_async_pool.py +0 -0
  57. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/base_pool_type.py +0 -0
  58. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
  59. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
  60. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
  61. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
  62. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
  63. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
  64. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
  65. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
  66. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
  67. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
  68. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/pool_commons.py +0 -0
  69. {funboost-49.7 → funboost-49.9}/funboost/concurrent_pool/single_thread_executor.py +0 -0
  70. {funboost-49.7 → funboost-49.9}/funboost/consumers/__init__.py +0 -0
  71. {funboost-49.7 → funboost-49.9}/funboost/consumers/celery_consumer.py +0 -0
  72. {funboost-49.7 → funboost-49.9}/funboost/consumers/confirm_mixin.py +0 -0
  73. {funboost-49.7 → funboost-49.9}/funboost/consumers/dramatiq_consumer.py +0 -0
  74. {funboost-49.7 → funboost-49.9}/funboost/consumers/empty_consumer.py +0 -0
  75. {funboost-49.7 → funboost-49.9}/funboost/consumers/faststream_consumer.py +0 -0
  76. {funboost-49.7 → funboost-49.9}/funboost/consumers/http_consumer.py +0 -0
  77. {funboost-49.7 → funboost-49.9}/funboost/consumers/http_consumer000.py +0 -0
  78. {funboost-49.7 → funboost-49.9}/funboost/consumers/httpsqs_consumer.py +0 -0
  79. {funboost-49.7 → funboost-49.9}/funboost/consumers/huey_consumer.py +0 -0
  80. {funboost-49.7 → funboost-49.9}/funboost/consumers/kombu_consumer.py +0 -0
  81. {funboost-49.7 → funboost-49.9}/funboost/consumers/local_python_queue_consumer.py +0 -0
  82. {funboost-49.7 → funboost-49.9}/funboost/consumers/memory_deque_consumer.py +0 -0
  83. {funboost-49.7 → funboost-49.9}/funboost/consumers/mongomq_consumer.py +0 -0
  84. {funboost-49.7 → funboost-49.9}/funboost/consumers/mqtt_consumer.py +0 -0
  85. {funboost-49.7 → funboost-49.9}/funboost/consumers/nameko_consumer.py +0 -0
  86. {funboost-49.7 → funboost-49.9}/funboost/consumers/nats_consumer.py +0 -0
  87. {funboost-49.7 → funboost-49.9}/funboost/consumers/nsq_consumer.py +0 -0
  88. {funboost-49.7 → funboost-49.9}/funboost/consumers/peewee_conusmer.py +0 -0
  89. {funboost-49.7 → funboost-49.9}/funboost/consumers/persist_queue_consumer.py +0 -0
  90. {funboost-49.7 → funboost-49.9}/funboost/consumers/pulsar_consumer.py +0 -0
  91. {funboost-49.7 → funboost-49.9}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
  92. {funboost-49.7 → funboost-49.9}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
  93. {funboost-49.7 → funboost-49.9}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
  94. {funboost-49.7 → funboost-49.9}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
  95. {funboost-49.7 → funboost-49.9}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
  96. {funboost-49.7 → funboost-49.9}/funboost/consumers/redis_consumer.py +0 -0
  97. {funboost-49.7 → funboost-49.9}/funboost/consumers/redis_consumer_ack_able.py +0 -0
  98. {funboost-49.7 → funboost-49.9}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
  99. {funboost-49.7 → funboost-49.9}/funboost/consumers/redis_consumer_priority.py +0 -0
  100. {funboost-49.7 → funboost-49.9}/funboost/consumers/redis_consumer_simple.py +0 -0
  101. {funboost-49.7 → funboost-49.9}/funboost/consumers/redis_filter.py +0 -0
  102. {funboost-49.7 → funboost-49.9}/funboost/consumers/redis_pubsub_consumer.py +0 -0
  103. {funboost-49.7 → funboost-49.9}/funboost/consumers/redis_stream_consumer.py +0 -0
  104. {funboost-49.7 → funboost-49.9}/funboost/consumers/rocketmq_consumer.py +0 -0
  105. {funboost-49.7 → funboost-49.9}/funboost/consumers/rq_consumer.py +0 -0
  106. {funboost-49.7 → funboost-49.9}/funboost/consumers/sqlachemy_consumer.py +0 -0
  107. {funboost-49.7 → funboost-49.9}/funboost/consumers/tcp_consumer.py +0 -0
  108. {funboost-49.7 → funboost-49.9}/funboost/consumers/txt_file_consumer.py +0 -0
  109. {funboost-49.7 → funboost-49.9}/funboost/consumers/udp_consumer.py +0 -0
  110. {funboost-49.7 → funboost-49.9}/funboost/consumers/zeromq_consumer.py +0 -0
  111. {funboost-49.7 → funboost-49.9}/funboost/contrib/__init__.py +0 -0
  112. {funboost-49.7 → funboost-49.9}/funboost/contrib/api_publish_msg.py +0 -0
  113. {funboost-49.7/funboost/core → funboost-49.9/funboost/contrib/cdc}/__init__.py +0 -0
  114. {funboost-49.7 → funboost-49.9}/funboost/contrib/django_db_deco.py +0 -0
  115. {funboost-49.7 → funboost-49.9}/funboost/contrib/queue2queue.py +0 -0
  116. {funboost-49.7 → funboost-49.9}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
  117. {funboost-49.7 → funboost-49.9}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
  118. {funboost-49.7/funboost/core/cli → funboost-49.9/funboost/core}/__init__.py +0 -0
  119. {funboost-49.7 → funboost-49.9}/funboost/core/active_cousumer_info_getter.py +0 -0
  120. {funboost-49.7/funboost/queues → funboost-49.9/funboost/core/cli}/__init__.py +0 -0
  121. {funboost-49.7 → funboost-49.9}/funboost/core/cli/discovery_boosters.py +0 -0
  122. {funboost-49.7 → funboost-49.9}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
  123. {funboost-49.7 → funboost-49.9}/funboost/core/cli/funboost_fire.py +0 -0
  124. {funboost-49.7 → funboost-49.9}/funboost/core/current_task.py +0 -0
  125. {funboost-49.7 → funboost-49.9}/funboost/core/fabric_deploy_helper.py +0 -0
  126. {funboost-49.7 → funboost-49.9}/funboost/core/funboost_config_getter.py +0 -0
  127. {funboost-49.7 → funboost-49.9}/funboost/core/funboost_time.py +0 -0
  128. {funboost-49.7 → funboost-49.9}/funboost/core/function_result_status_config.py +0 -0
  129. {funboost-49.7 → funboost-49.9}/funboost/core/function_result_status_saver.py +0 -0
  130. {funboost-49.7 → funboost-49.9}/funboost/core/helper_funs.py +0 -0
  131. {funboost-49.7 → funboost-49.9}/funboost/core/kill_remote_task.py +0 -0
  132. {funboost-49.7 → funboost-49.9}/funboost/core/lazy_impoter.py +0 -0
  133. {funboost-49.7 → funboost-49.9}/funboost/core/loggers.py +0 -0
  134. {funboost-49.7 → funboost-49.9}/funboost/core/muliti_process_enhance.py +0 -0
  135. {funboost-49.7 → funboost-49.9}/funboost/core/serialization.py +0 -0
  136. {funboost-49.7 → funboost-49.9}/funboost/core/task_id_logger.py +0 -0
  137. {funboost-49.7 → funboost-49.9}/funboost/factories/__init__.py +0 -0
  138. {funboost-49.7 → funboost-49.9}/funboost/factories/consumer_factory.py +0 -0
  139. {funboost-49.7 → funboost-49.9}/funboost/factories/publisher_factotry.py +0 -0
  140. {funboost-49.7 → funboost-49.9}/funboost/funboost_config_deafult.py +0 -0
  141. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/__pycache__/app.cpython-313.pyc +0 -0
  142. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
  143. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/__pycache__/app.cpython-39.pyc +0 -0
  144. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/__pycache__/functions.cpython-313.pyc +0 -0
  145. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  146. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
  147. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/app.py +0 -0
  148. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/app_debug_start.py +0 -0
  149. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/functions.py +0 -0
  150. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/assets/css/custom.css +0 -0
  151. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
  152. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
  153. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/assets/js/custom.js +0 -0
  154. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
  155. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css/content_page_style.css +0 -0
  156. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css/style.css +0 -0
  157. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css +0 -0
  158. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/css/font-awesome.min.css +0 -0
  159. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/FontAwesome.otf +0 -0
  160. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.eot +0 -0
  161. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.svg +0 -0
  162. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf +0 -0
  163. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff +0 -0
  164. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2 +0 -0
  165. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/select2/4.0.13/css/select2.min.css +0 -0
  166. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator.min.css +0 -0
  167. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator_bootstrap3.min.css +0 -0
  168. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/css/bootstrap.min.css +0 -0
  169. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.eot +0 -0
  170. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.svg +0 -0
  171. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.ttf +0 -0
  172. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff +0 -0
  173. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff2 +0 -0
  174. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/images/bg.jpg +0 -0
  175. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/images/favicon.ico +0 -0
  176. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/images/password.png +0 -0
  177. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/images/tick.png +0 -0
  178. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/images/user.png +0 -0
  179. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/js/bootstrap-datetimepicker.min.js +0 -0
  180. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/js/echarts.min.js +0 -0
  181. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/js/form-memory.js +0 -0
  182. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
  183. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/js/moment-with-locales.min.js +0 -0
  184. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/js/select2.min.js +0 -0
  185. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/js_cdn/bootstrap/3.3.7/js/bootstrap.min.js +0 -0
  186. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/js_cdn/chart.js +0 -0
  187. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/static/js_cdn/tabulator-tables@5.5.0/dist/js/tabulator.min.js +0 -0
  188. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/about.html +0 -0
  189. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/conusme_speed.html +0 -0
  190. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/fun_result_table.html +0 -0
  191. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/index.html +0 -0
  192. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/index_backup.html +0 -0
  193. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/login.html +0 -0
  194. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/queue_op.html +0 -0
  195. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/rpc_call.html +0 -0
  196. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/running_consumer_by_ip.html +0 -0
  197. {funboost-49.7 → funboost-49.9}/funboost/function_result_web/templates/running_consumer_by_queue_name.html +0 -0
  198. {funboost-49.7 → funboost-49.9}/funboost/publishers/__init__.py +0 -0
  199. {funboost-49.7 → funboost-49.9}/funboost/publishers/celery_publisher.py +0 -0
  200. {funboost-49.7 → funboost-49.9}/funboost/publishers/celery_publisher000.py +0 -0
  201. {funboost-49.7 → funboost-49.9}/funboost/publishers/confluent_kafka_publisher.py +0 -0
  202. {funboost-49.7 → funboost-49.9}/funboost/publishers/dramatiq_publisher.py +0 -0
  203. {funboost-49.7 → funboost-49.9}/funboost/publishers/empty_publisher.py +0 -0
  204. {funboost-49.7 → funboost-49.9}/funboost/publishers/faststream_publisher.py +0 -0
  205. {funboost-49.7 → funboost-49.9}/funboost/publishers/http_publisher.py +0 -0
  206. {funboost-49.7 → funboost-49.9}/funboost/publishers/httpsqs_publisher.py +0 -0
  207. {funboost-49.7 → funboost-49.9}/funboost/publishers/huey_publisher.py +0 -0
  208. {funboost-49.7 → funboost-49.9}/funboost/publishers/kombu_publisher.py +0 -0
  209. {funboost-49.7 → funboost-49.9}/funboost/publishers/local_python_queue_publisher.py +0 -0
  210. {funboost-49.7 → funboost-49.9}/funboost/publishers/meomory_deque_publisher.py +0 -0
  211. {funboost-49.7 → funboost-49.9}/funboost/publishers/mongomq_publisher.py +0 -0
  212. {funboost-49.7 → funboost-49.9}/funboost/publishers/mqtt_publisher.py +0 -0
  213. {funboost-49.7 → funboost-49.9}/funboost/publishers/nameko_publisher.py +0 -0
  214. {funboost-49.7 → funboost-49.9}/funboost/publishers/nats_publisher.py +0 -0
  215. {funboost-49.7 → funboost-49.9}/funboost/publishers/nsq_publisher.py +0 -0
  216. {funboost-49.7 → funboost-49.9}/funboost/publishers/peewee_publisher.py +0 -0
  217. {funboost-49.7 → funboost-49.9}/funboost/publishers/persist_queue_publisher.py +0 -0
  218. {funboost-49.7 → funboost-49.9}/funboost/publishers/pulsar_publisher.py +0 -0
  219. {funboost-49.7 → funboost-49.9}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
  220. {funboost-49.7 → funboost-49.9}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
  221. {funboost-49.7 → funboost-49.9}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
  222. {funboost-49.7 → funboost-49.9}/funboost/publishers/redis_publisher.py +0 -0
  223. {funboost-49.7 → funboost-49.9}/funboost/publishers/redis_publisher_lpush.py +0 -0
  224. {funboost-49.7 → funboost-49.9}/funboost/publishers/redis_publisher_priority.py +0 -0
  225. {funboost-49.7 → funboost-49.9}/funboost/publishers/redis_publisher_simple.py +0 -0
  226. {funboost-49.7 → funboost-49.9}/funboost/publishers/redis_pubsub_publisher.py +0 -0
  227. {funboost-49.7 → funboost-49.9}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
  228. {funboost-49.7 → funboost-49.9}/funboost/publishers/redis_stream_publisher.py +0 -0
  229. {funboost-49.7 → funboost-49.9}/funboost/publishers/rocketmq_publisher.py +0 -0
  230. {funboost-49.7 → funboost-49.9}/funboost/publishers/rq_publisher.py +0 -0
  231. {funboost-49.7 → funboost-49.9}/funboost/publishers/sqla_queue_publisher.py +0 -0
  232. {funboost-49.7 → funboost-49.9}/funboost/publishers/tcp_publisher.py +0 -0
  233. {funboost-49.7 → funboost-49.9}/funboost/publishers/txt_file_publisher.py +0 -0
  234. {funboost-49.7 → funboost-49.9}/funboost/publishers/udp_publisher.py +0 -0
  235. {funboost-49.7 → funboost-49.9}/funboost/publishers/zeromq_publisher.py +0 -0
  236. {funboost-49.7/funboost/utils/dependency_packages → funboost-49.9/funboost/queues}/__init__.py +0 -0
  237. {funboost-49.7 → funboost-49.9}/funboost/queues/memory_queues_map.py +0 -0
  238. {funboost-49.7 → funboost-49.9}/funboost/queues/peewee_queue.py +0 -0
  239. {funboost-49.7 → funboost-49.9}/funboost/queues/sqla_queue.py +0 -0
  240. {funboost-49.7 → funboost-49.9}/funboost/set_frame_config.py +0 -0
  241. {funboost-49.7 → funboost-49.9}/funboost/timing_job/__init__.py +0 -0
  242. {funboost-49.7 → funboost-49.9}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
  243. {funboost-49.7 → funboost-49.9}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
  244. {funboost-49.7 → funboost-49.9}/funboost/timing_job/timing_job_base.py +0 -0
  245. {funboost-49.7 → funboost-49.9}/funboost/utils/__init__.py +0 -0
  246. {funboost-49.7 → funboost-49.9}/funboost/utils/apscheduler_monkey.py +0 -0
  247. {funboost-49.7 → funboost-49.9}/funboost/utils/block_exit.py +0 -0
  248. {funboost-49.7 → funboost-49.9}/funboost/utils/bulk_operation.py +0 -0
  249. {funboost-49.7 → funboost-49.9}/funboost/utils/class_utils.py +0 -0
  250. {funboost-49.7 → funboost-49.9}/funboost/utils/ctrl_c_end.py +0 -0
  251. {funboost-49.7 → funboost-49.9}/funboost/utils/decorators.py +0 -0
  252. {funboost-49.7/funboost/utils/dependency_packages_in_pythonpath → funboost-49.9/funboost/utils/dependency_packages}/__init__.py +0 -0
  253. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
  254. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
  255. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
  256. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
  257. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
  258. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
  259. {funboost-49.7/funboost/utils/func_timeout → funboost-49.9/funboost/utils/dependency_packages_in_pythonpath}/__init__.py +0 -0
  260. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
  261. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-313.pyc +0 -0
  262. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
  263. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  264. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
  265. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-313.pyc +0 -0
  266. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
  267. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  268. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
  269. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
  270. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
  271. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
  272. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
  273. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
  274. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
  275. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
  276. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
  277. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
  278. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  279. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
  280. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
  281. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
  282. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
  283. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
  284. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
  285. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
  286. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
  287. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
  288. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
  289. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
  290. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
  291. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
  292. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
  293. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
  294. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
  295. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
  296. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
  297. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
  298. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
  299. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
  300. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
  301. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
  302. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
  303. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
  304. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
  305. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
  306. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
  307. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
  308. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
  309. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
  310. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
  311. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
  312. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
  313. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
  314. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
  315. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
  316. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
  317. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
  318. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
  319. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
  320. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
  321. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
  322. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
  323. {funboost-49.7 → funboost-49.9}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
  324. {funboost-49.7 → funboost-49.9}/funboost/utils/develop_log.py +0 -0
  325. {funboost-49.7 → funboost-49.9}/funboost/utils/expire_lock.py +0 -0
  326. {funboost-49.7 → funboost-49.9}/funboost/utils/func_timeout/StoppableThread.py +0 -0
  327. {funboost-49.7 → funboost-49.9}/funboost/utils/func_timeout/dafunc.py +0 -0
  328. {funboost-49.7 → funboost-49.9}/funboost/utils/func_timeout/exceptions.py +0 -0
  329. {funboost-49.7 → funboost-49.9}/funboost/utils/func_timeout/py2_raise.py +0 -0
  330. {funboost-49.7 → funboost-49.9}/funboost/utils/func_timeout/py3_raise.py +0 -0
  331. {funboost-49.7 → funboost-49.9}/funboost/utils/json_helper.py +0 -0
  332. {funboost-49.7 → funboost-49.9}/funboost/utils/mongo_util.py +0 -0
  333. {funboost-49.7 → funboost-49.9}/funboost/utils/monkey_color_log.py +0 -0
  334. {funboost-49.7 → funboost-49.9}/funboost/utils/monkey_patches.py +0 -0
  335. {funboost-49.7 → funboost-49.9}/funboost/utils/mqtt_util.py +0 -0
  336. {funboost-49.7 → funboost-49.9}/funboost/utils/paramiko_util.py +0 -0
  337. {funboost-49.7 → funboost-49.9}/funboost/utils/rabbitmq_factory.py +0 -0
  338. {funboost-49.7 → funboost-49.9}/funboost/utils/redis_manager.py +0 -0
  339. {funboost-49.7 → funboost-49.9}/funboost/utils/redis_manager_old.py +0 -0
  340. {funboost-49.7 → funboost-49.9}/funboost/utils/resource_monitoring.py +0 -0
  341. {funboost-49.7 → funboost-49.9}/funboost/utils/restart_python.py +0 -0
  342. {funboost-49.7 → funboost-49.9}/funboost/utils/simple_data_class.py +0 -0
  343. {funboost-49.7 → funboost-49.9}/funboost/utils/str_utils.py +0 -0
  344. {funboost-49.7 → funboost-49.9}/funboost/utils/time_util.py +0 -0
  345. {funboost-49.7 → funboost-49.9}/funboost/utils/un_strict_json_dumps.py +0 -0
  346. {funboost-49.7 → funboost-49.9}/funboost.egg-info/dependency_links.txt +0 -0
  347. {funboost-49.7 → funboost-49.9}/funboost.egg-info/entry_points.txt +0 -0
  348. {funboost-49.7 → funboost-49.9}/funboost.egg-info/top_level.txt +0 -0
  349. {funboost-49.7 → funboost-49.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 49.7
3
+ Version: 49.9
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
@@ -83,6 +83,10 @@ Requires-Dist: pyzmq; extra == "all"
83
83
  Requires-Dist: kafka-python==2.0.2; extra == "all"
84
84
  Requires-Dist: eventlet==0.33.3; extra == "all"
85
85
  Requires-Dist: gevent==22.10.2; extra == "all"
86
+ Requires-Dist: mysql-replication==1.0.9; extra == "all"
87
+ Requires-Dist: grpcio==1.60.0; extra == "all"
88
+ Requires-Dist: grpcio-tools==1.60.0; extra == "all"
89
+ Requires-Dist: protobuf==4.25.1; extra == "all"
86
90
  Requires-Dist: flask; extra == "all"
87
91
  Requires-Dist: flask_bootstrap; extra == "all"
88
92
  Requires-Dist: flask_wtf; extra == "all"
@@ -113,6 +117,10 @@ Requires-Dist: pyzmq; extra == "extra-brokers"
113
117
  Requires-Dist: kafka-python==2.0.2; extra == "extra-brokers"
114
118
  Requires-Dist: eventlet==0.33.3; extra == "extra-brokers"
115
119
  Requires-Dist: gevent==22.10.2; extra == "extra-brokers"
120
+ Requires-Dist: mysql-replication==1.0.9; extra == "extra-brokers"
121
+ Requires-Dist: grpcio==1.60.0; extra == "extra-brokers"
122
+ Requires-Dist: grpcio-tools==1.60.0; extra == "extra-brokers"
123
+ Requires-Dist: protobuf==4.25.1; extra == "extra-brokers"
116
124
  Provides-Extra: flask
117
125
  Requires-Dist: flask; extra == "flask"
118
126
  Requires-Dist: flask_bootstrap; extra == "flask"
@@ -182,45 +190,65 @@ funboost的旧框架名字是function_scheduling_distributed_framework , 关系
182
190
 
183
191
  ## 1.0 github地址和文档地址
184
192
 
185
- ### 1.0.1 [分布式函数调度框架文档地址 ](https://funboost.readthedocs.io/zh-cn/latest/index.html)
193
+ ### 1.0.1 分布式函数调度框架文档地址
186
194
 
187
195
  [查看分布式函数调度框架文档 https://funboost.readthedocs.io/zh-cn/latest/index.html](https://funboost.readthedocs.io/zh-cn/latest/index.html)
188
196
 
189
- 文档很长,大部分都是讲原理和对比各种框架。但是用户只需要学习1.3这1个例子就能掌握了。因为其他例子只是 @boost的 BoosterParams 里面的控制入参换了一下。
197
+ 文档很长,大部分都是讲原理和对比各种框架,不仅仅 `how` to use,更多的是 `What` & `Why`。
198
+ 但是用户只需要学习1.3这1个例子就能掌握了。因为其他例子只是 @boost的 BoosterParams 里面的控制入参换了一下。
199
+
190
200
 
191
201
  用户只需要专门看 BoosterParams 里面的每个入参的注释就能掌握框架了,因为funboost只有@boost一行代码需要你写。
192
202
 
193
203
  funboost 框架和一般的框架不一样,因为只有一行代码需要掌握,绝对不是要求用户先精通框架本身才能自由发挥。
194
204
 
195
- #### [1.python万能分布式函数调度框架简funboost简介](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
196
-
197
- #### [2. funboost对比celery框架](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
198
-
199
- #### [3.funboost框架详细介绍](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
200
-
201
- #### [4.funboost使用框架的各种代码示例](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
202
-
203
- #### [4b.funboost使用框架的各种代码示例(高级进阶)](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
204
-
205
- #### [5.funboost框架运行时截图](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
206
-
207
- #### [6.funboost常见问题回答](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
208
-
209
- #### [7.funboost更新记录](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
210
-
211
- #### [8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
212
205
 
213
- #### [9.轻松远程服务器部署运行函数](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
214
-
215
- #### [10.python3.6-3.12 安装/使用funboost出错问题反馈](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
216
-
217
- #### [11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
218
-
219
- #### [12.funboost 控制台支持命令行](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
220
-
221
- #### [13.启动 funboost web manager,查看消费结果和队列管理](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
222
-
223
- #### [funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
206
+ [**1.python万能分布式函数调度框架简funboost简介**](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
207
+
208
+ ##### 2. funboost对比celery框架
209
+ [**2.funboost对比celery框架**](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
210
+ [2.funboost对比celery框架](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
211
+ [**3.funboost框架详细介绍**](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
212
+ ##### 3.funboost框架详细介绍
213
+ [**4.funboost使用框架的各种代码示例**](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
214
+ [3.funboost框架详细介绍](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
215
+ [**4b.funboost使用框架的各种代码示例(高级进阶)**](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
216
+ ##### 4.funboost使用框架的各种代码示例
217
+ [4.funboost使用框架的各种代码示例](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
218
+ [**5.funboost框架运行时截图**](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
219
+ ##### 4b.funboost使用框架的各种代码示例(高级进阶)
220
+ [4b.funboost使用框架的各种代码示例(高级进阶)](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
221
+ [**6.funboost常见问题回答**](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
222
+ ##### 5.funboost框架运行时截图
223
+ [5.funboost框架运行时截图](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
224
+ [**7.funboost更新记录**](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
225
+ ##### 6.funboost常见问题回答
226
+ [6.funboost常见问题回答](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
227
+ [**8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役**](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
228
+ ##### 7.funboost更新记录
229
+ [7.funboost更新记录](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
230
+ [**9.轻松远程服务器部署运行函数**](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
231
+ ##### 8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役
232
+ [8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
233
+ [**10.python3.6-3.12 安装/使用funboost出错问题反馈**](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
234
+ ##### 9.轻松远程服务器部署运行函数
235
+ [9.轻松远程服务器部署运行函数](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
236
+ [**11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。**](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
237
+ ##### 10.python3.6-3.12 安装/使用funboost出错问题反馈
238
+ [10.python3.6-3.12 安装/使用funboost出错问题反馈](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
239
+ [**12.funboost 控制台支持命令行**](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
240
+ ##### 11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。
241
+ [11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
242
+ [**13.启动 funboost web manager,查看消费结果和队列管理**](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
243
+ ##### 12.funboost 控制台支持命令行
244
+ [12.funboost 控制台支持命令行](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
245
+
246
+ ##### 13.启动 funboost web manager,查看消费结果和队列管理
247
+ [13.启动 funboost web manager,查看消费结果和队列管理](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
248
+
249
+
250
+ #### funboost依赖的nb_log日志文档
251
+ [funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
224
252
 
225
253
  ```
226
254
  文档很长,但归根结底只需要学习 1.3 里面的这1个例子就行,主要是修改下@boost的各种参数,
@@ -234,7 +262,7 @@ funboost 框架和一般的框架不一样,因为只有一行代码需要掌
234
262
  很多新手需要小心翼翼模仿网上说的项目目录结构,以为不按照那么规划目录和命名就玩不起来,本身说明celery很坑。
235
263
  ```
236
264
 
237
- ### 1.0.2 [分布式函数调度框架github地址](https://github.com/ydf0509/funboost)
265
+ ### 1.0.2 分布式函数调度框架github地址
238
266
 
239
267
  [查看分布式函数调度框架github项目](https://github.com/ydf0509/funboost)
240
268
 
@@ -489,8 +517,14 @@ win cmd和linux 运行时候,设置 PYTHONPATH 为项目根目录,是为了
489
517
  而是根据实际情况函数的参数个数、函数的内部逻辑功能,全部都由用户自定义,函数里面想写什么就写什么,想干什么就干什么,极端自由。
490
518
  也就是框架很容易学和使用,把下面的task_fun函数的入参和内部逻辑换成你自己想写的函数功能就可以了,框架只需要学习boost这一个函数的参数就行。
491
519
  测试使用的时候函数里面加上sleep模拟阻塞,从而更好的了解框架的并发和各种控制功能。
520
+ ```
521
+
522
+ ```
523
+ 有一点要说明的是框架的消息中间件的ip 端口 密码 等配置是在你第一次运行代码时候,在你当前项目的根目录下生成的 funboost_config.py 按需设置 (默认放在项目根目录是为了方便利用项目的 PYTHONPATH。当然,只要 PYTHONPATH 设置正确,
524
+ 该配置文件可以放在磁盘的任意文件夹里面。用户可以看教程 6.18.3 问答章节)。
492
525
 
493
- 有一点要说明的是框架的消息中间件的ip 端口 密码 等配置是在你第一次运行代码时候,在你当前项目的根目录下生成的 funboost_config.py 按需设置。
526
+ funboost_config.py 里面仅仅是配置 中间件连接,例如ip 端口这些简单的配置, 只需要第一次配置正确即可,
527
+ 后续的开发中基本无需再次修改此文件。 因为所有消费函数任务控制功能都是在 BoosterParams 中传参。
494
528
  ```
495
529
 
496
530
  ### 1.3.1 funboost最简单例子
@@ -686,7 +720,9 @@ def task_fun(a: int, b: int):
686
720
  队列操作,查看消费者详情:查看队列的所有消费者详情
687
721
  [![pEJCgT1.png](https://s21.ax1x.com/2025/03/04/pEJCgT1.png)](https://imgse.com/i/pEJCgT1)
688
722
 
723
+
689
724
  队列操作:查看消费曲线图,查看各种消费指标。
725
+ 包括 历史运行次数 历史运行失败次数 近10秒完成 近10秒失败 近10秒函数运行平均耗时 累计函数运行平均耗时 剩余消息数量
690
726
  [![pVpr7sP.png](https://s21.ax1x.com/2025/05/29/pVpr7sP.png)](https://imgse.com/i/pVpr7sP)
691
727
 
692
728
  rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;根据taskid获取结果。
@@ -60,45 +60,65 @@ funboost的旧框架名字是function_scheduling_distributed_framework , 关系
60
60
 
61
61
  ## 1.0 github地址和文档地址
62
62
 
63
- ### 1.0.1 [分布式函数调度框架文档地址 ](https://funboost.readthedocs.io/zh-cn/latest/index.html)
63
+ ### 1.0.1 分布式函数调度框架文档地址
64
64
 
65
65
  [查看分布式函数调度框架文档 https://funboost.readthedocs.io/zh-cn/latest/index.html](https://funboost.readthedocs.io/zh-cn/latest/index.html)
66
66
 
67
- 文档很长,大部分都是讲原理和对比各种框架。但是用户只需要学习1.3这1个例子就能掌握了。因为其他例子只是 @boost的 BoosterParams 里面的控制入参换了一下。
67
+ 文档很长,大部分都是讲原理和对比各种框架,不仅仅 `how` to use,更多的是 `What` & `Why`。
68
+ 但是用户只需要学习1.3这1个例子就能掌握了。因为其他例子只是 @boost的 BoosterParams 里面的控制入参换了一下。
69
+
68
70
 
69
71
  用户只需要专门看 BoosterParams 里面的每个入参的注释就能掌握框架了,因为funboost只有@boost一行代码需要你写。
70
72
 
71
73
  funboost 框架和一般的框架不一样,因为只有一行代码需要掌握,绝对不是要求用户先精通框架本身才能自由发挥。
72
74
 
73
- #### [1.python万能分布式函数调度框架简funboost简介](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
74
-
75
- #### [2. funboost对比celery框架](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
76
-
77
- #### [3.funboost框架详细介绍](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
78
-
79
- #### [4.funboost使用框架的各种代码示例](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
80
-
81
- #### [4b.funboost使用框架的各种代码示例(高级进阶)](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
82
-
83
- #### [5.funboost框架运行时截图](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
84
-
85
- #### [6.funboost常见问题回答](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
86
-
87
- #### [7.funboost更新记录](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
88
-
89
- #### [8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
90
75
 
91
- #### [9.轻松远程服务器部署运行函数](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
92
-
93
- #### [10.python3.6-3.12 安装/使用funboost出错问题反馈](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
94
-
95
- #### [11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
96
-
97
- #### [12.funboost 控制台支持命令行](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
98
-
99
- #### [13.启动 funboost web manager,查看消费结果和队列管理](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
100
-
101
- #### [funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
76
+ [**1.python万能分布式函数调度框架简funboost简介**](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
77
+
78
+ ##### 2. funboost对比celery框架
79
+ [**2.funboost对比celery框架**](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
80
+ [2.funboost对比celery框架](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
81
+ [**3.funboost框架详细介绍**](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
82
+ ##### 3.funboost框架详细介绍
83
+ [**4.funboost使用框架的各种代码示例**](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
84
+ [3.funboost框架详细介绍](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
85
+ [**4b.funboost使用框架的各种代码示例(高级进阶)**](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
86
+ ##### 4.funboost使用框架的各种代码示例
87
+ [4.funboost使用框架的各种代码示例](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
88
+ [**5.funboost框架运行时截图**](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
89
+ ##### 4b.funboost使用框架的各种代码示例(高级进阶)
90
+ [4b.funboost使用框架的各种代码示例(高级进阶)](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
91
+ [**6.funboost常见问题回答**](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
92
+ ##### 5.funboost框架运行时截图
93
+ [5.funboost框架运行时截图](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
94
+ [**7.funboost更新记录**](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
95
+ ##### 6.funboost常见问题回答
96
+ [6.funboost常见问题回答](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
97
+ [**8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役**](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
98
+ ##### 7.funboost更新记录
99
+ [7.funboost更新记录](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
100
+ [**9.轻松远程服务器部署运行函数**](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
101
+ ##### 8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役
102
+ [8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
103
+ [**10.python3.6-3.12 安装/使用funboost出错问题反馈**](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
104
+ ##### 9.轻松远程服务器部署运行函数
105
+ [9.轻松远程服务器部署运行函数](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
106
+ [**11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。**](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
107
+ ##### 10.python3.6-3.12 安装/使用funboost出错问题反馈
108
+ [10.python3.6-3.12 安装/使用funboost出错问题反馈](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
109
+ [**12.funboost 控制台支持命令行**](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
110
+ ##### 11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。
111
+ [11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
112
+ [**13.启动 funboost web manager,查看消费结果和队列管理**](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
113
+ ##### 12.funboost 控制台支持命令行
114
+ [12.funboost 控制台支持命令行](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
115
+
116
+ ##### 13.启动 funboost web manager,查看消费结果和队列管理
117
+ [13.启动 funboost web manager,查看消费结果和队列管理](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
118
+
119
+
120
+ #### funboost依赖的nb_log日志文档
121
+ [funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
102
122
 
103
123
  ```
104
124
  文档很长,但归根结底只需要学习 1.3 里面的这1个例子就行,主要是修改下@boost的各种参数,
@@ -112,7 +132,7 @@ funboost 框架和一般的框架不一样,因为只有一行代码需要掌
112
132
  很多新手需要小心翼翼模仿网上说的项目目录结构,以为不按照那么规划目录和命名就玩不起来,本身说明celery很坑。
113
133
  ```
114
134
 
115
- ### 1.0.2 [分布式函数调度框架github地址](https://github.com/ydf0509/funboost)
135
+ ### 1.0.2 分布式函数调度框架github地址
116
136
 
117
137
  [查看分布式函数调度框架github项目](https://github.com/ydf0509/funboost)
118
138
 
@@ -367,8 +387,14 @@ win cmd和linux 运行时候,设置 PYTHONPATH 为项目根目录,是为了
367
387
  而是根据实际情况函数的参数个数、函数的内部逻辑功能,全部都由用户自定义,函数里面想写什么就写什么,想干什么就干什么,极端自由。
368
388
  也就是框架很容易学和使用,把下面的task_fun函数的入参和内部逻辑换成你自己想写的函数功能就可以了,框架只需要学习boost这一个函数的参数就行。
369
389
  测试使用的时候函数里面加上sleep模拟阻塞,从而更好的了解框架的并发和各种控制功能。
390
+ ```
391
+
392
+ ```
393
+ 有一点要说明的是框架的消息中间件的ip 端口 密码 等配置是在你第一次运行代码时候,在你当前项目的根目录下生成的 funboost_config.py 按需设置 (默认放在项目根目录是为了方便利用项目的 PYTHONPATH。当然,只要 PYTHONPATH 设置正确,
394
+ 该配置文件可以放在磁盘的任意文件夹里面。用户可以看教程 6.18.3 问答章节)。
370
395
 
371
- 有一点要说明的是框架的消息中间件的ip 端口 密码 等配置是在你第一次运行代码时候,在你当前项目的根目录下生成的 funboost_config.py 按需设置。
396
+ funboost_config.py 里面仅仅是配置 中间件连接,例如ip 端口这些简单的配置, 只需要第一次配置正确即可,
397
+ 后续的开发中基本无需再次修改此文件。 因为所有消费函数任务控制功能都是在 BoosterParams 中传参。
372
398
  ```
373
399
 
374
400
  ### 1.3.1 funboost最简单例子
@@ -564,7 +590,9 @@ def task_fun(a: int, b: int):
564
590
  队列操作,查看消费者详情:查看队列的所有消费者详情
565
591
  [![pEJCgT1.png](https://s21.ax1x.com/2025/03/04/pEJCgT1.png)](https://imgse.com/i/pEJCgT1)
566
592
 
593
+
567
594
  队列操作:查看消费曲线图,查看各种消费指标。
595
+ 包括 历史运行次数 历史运行失败次数 近10秒完成 近10秒失败 近10秒函数运行平均耗时 累计函数运行平均耗时 剩余消息数量
568
596
  [![pVpr7sP.png](https://s21.ax1x.com/2025/05/29/pVpr7sP.png)](https://imgse.com/i/pVpr7sP)
569
597
 
570
598
  rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;根据taskid获取结果。
@@ -13,7 +13,7 @@ set_frame_config这个模块的 use_config_form_funboost_config_module() 是核
13
13
  这段注释说明和使用的用户无关,只和框架开发人员有关.
14
14
  '''
15
15
 
16
- __version__ = "49.7"
16
+ __version__ = "49.9"
17
17
 
18
18
  from funboost.set_frame_config import show_frame_config
19
19
 
@@ -8,7 +8,7 @@ import threading
8
8
  from functools import partial
9
9
 
10
10
  import celery
11
-
11
+ from celery.app.task import Task
12
12
  import nb_log
13
13
  from funboost.funboost_config_deafult import BrokerConnConfig,FunboostCommonConfig
14
14
  from funboost import ConcurrentModeEnum
@@ -6,6 +6,7 @@ import threading
6
6
  import time
7
7
  import traceback
8
8
  from threading import Thread
9
+ import traceback
9
10
 
10
11
  from funboost.concurrent_pool.base_pool_type import FunboostBaseConcurrentPool
11
12
  from funboost.core.loggers import FunboostFileLoggerMixin
@@ -53,14 +54,17 @@ class AsyncPoolExecutor(FunboostFileLoggerMixin,FunboostBaseConcurrentPool):
53
54
  使api和线程池一样,最好的性能做法是submit也弄成 async def,生产和消费在同一个线程同一个loop一起运行,但会对调用链路的兼容性产生破坏,从而调用方式不兼容线程池。
54
55
  """
55
56
 
56
- def __init__(self, size, loop=None):
57
+ def __init__(self, size, specify_async_loop=None,
58
+ is_auto_start_specify_async_loop_in_child_thread=True):
57
59
  """
58
60
 
59
61
  :param size: 同时并发运行的协程任务数量。
60
- :param loop:
62
+ :param specify_loop: 可以指定loop,异步三方包的连接池发请求不能使用不同的loop去使用连接池.
61
63
  """
62
64
  self._size = size
63
- self.loop = loop or asyncio.new_event_loop()
65
+ self._specify_async_loop = specify_async_loop
66
+ self._is_auto_start_specify_async_loop_in_child_thread = is_auto_start_specify_async_loop_in_child_thread
67
+ self.loop = specify_async_loop or asyncio.new_event_loop()
64
68
  asyncio.set_event_loop(self.loop)
65
69
  self._diff_init()
66
70
  # self._lock = threading.Lock()
@@ -90,7 +94,7 @@ class AsyncPoolExecutor(FunboostFileLoggerMixin,FunboostBaseConcurrentPool):
90
94
 
91
95
  def submit(self, func, *args, **kwargs):
92
96
  future = asyncio.run_coroutine_threadsafe(self._produce(func, *args, **kwargs), self.loop) # 这个 run_coroutine_threadsafe 方法也有缺点,消耗的性能巨大。
93
- future.result() # 阻止过快放入,放入超过队列大小后,使submit阻塞。
97
+ future.result() # 阻止过快放入,放入超过队列大小后,使submit阻塞。 背压是为了防止 迅速掏空消息队列几千万消息到内存.
94
98
 
95
99
  async def _produce(self, func, *args, **kwargs):
96
100
  await self._queue.put((func, args, kwargs))
@@ -119,12 +123,22 @@ class AsyncPoolExecutor(FunboostFileLoggerMixin,FunboostBaseConcurrentPool):
119
123
  # asyncio.set_event_loop(self.loop)
120
124
  # self.loop.run_until_complete(asyncio.wait([self._consume() for _ in range(self._size)], loop=self.loop))
121
125
  # self._can_be_closed_flag = True
122
- [self.loop.create_task(self._consume()) for _ in range(self._size)]
123
- try:
126
+ if self._specify_async_loop is None:
127
+ for _ in range(self._size):
128
+ self.loop.create_task(self._consume())
129
+ else:
130
+ for _ in range(self._size):
131
+ asyncio.run_coroutine_threadsafe(self._consume(),self.loop) # 这是 asyncio 专门提供的用于从其他线程向事件循环安全提交任务的函数。
132
+ if self._specify_async_loop is None:
124
133
  self.loop.run_forever()
125
- except Exception as e:
126
- self.logger.warning(f'{e}') # 如果多个线程使用一个loop,不能重复启动loop,否则会报错。
127
-
134
+ else:
135
+ if self._is_auto_start_specify_async_loop_in_child_thread:
136
+ try:
137
+ self.loop.run_forever() #如果是指定的loop不能多次启动一个loop.
138
+ except Exception as e:
139
+ self.logger.warning(f'{e} {traceback.format_exc()}') # 如果多个线程使用一个loop,不能重复启动loop,否则会报错。
140
+ else:
141
+ pass # 用户需要自己在自己的业务代码中去手动启动loop.run_forever()
128
142
 
129
143
 
130
144
  # def shutdown(self):
@@ -139,14 +153,6 @@ class AsyncPoolExecutor(FunboostFileLoggerMixin,FunboostBaseConcurrentPool):
139
153
 
140
154
 
141
155
 
142
-
143
-
144
-
145
-
146
-
147
-
148
-
149
-
150
156
  if __name__ == '__main__':
151
157
  def test_async_pool_executor():
152
158
  from funboost.concurrent_pool import CustomThreadPoolExecutor as ThreadPoolExecutor
@@ -101,6 +101,8 @@ class BrokerEnum:
101
101
 
102
102
  HTTP = 'HTTP' # 基于http实现的,发布使用的urllib3,消费服务端使用的aiohttp.server实现的,支持分布式但不支持持久化,好处是不需要安装消息队列中间件软件。
103
103
 
104
+ GRPC = 'GRPC' # 使用知名grpc作为broker,可以使用 sync_call 方法同步获取grpc的结果, 简单程度暴击用户手写原生的 grpc客户端 服务端
105
+
104
106
  NATS = 'NATS' # 高性能中间件nats,中间件服务端性能很好,。
105
107
 
106
108
  TXT_FILE = 'TXT_FILE' # 磁盘txt文件作为消息队列,支持单机持久化,不支持多机分布式。不建议这个,用sqlite。
@@ -119,6 +121,27 @@ class BrokerEnum:
119
121
 
120
122
  NAMEKO = 'NAMEKO' # funboost支持python微服务框架nameko,用户无需掌握nameko api语法,就玩转python nameko微服务
121
123
 
124
+
125
+ """
126
+ MYSQL_CDC 是 funboost 中 神奇 的 与众不同的 broker 中间件
127
+ mysql binlog cdc 自动作为消息,用户无需手动发布消息,只需要写处理binlog内容的逻辑,
128
+ 一行代码就能轻量级实现 mysql2mysql mysql2kafka mysql2rabbitmq 等等.
129
+ 这个是与其他中间件不同,不需要手工发布消息, 任何对数据库的 insert update delete 会自动作为 funboost 的消息.
130
+ 几乎是轻量级平替 canal flinkcdc 的作用.
131
+
132
+ 以此类推, 日志文件也能扩展作为broker,只要另外一个程序写入了文件日志,就能触发funboost消费,
133
+ 然后自己在函数逻辑把消息发到kafka,(虽然是已经有大名鼎鼎elk,这只是举个场景例子,说明funboost broker的灵活性)
134
+
135
+ 日志文件、文件系统变更(inotify)、甚至是硬件传感器的信号,按照4.21章节文档,都可以被封装成一个 funboost 的 Broker。
136
+
137
+ 充分说明 funboost 有能力化身为 通用的、事件驱动的函数调度平台,而非仅仅是celery这种传统的消息驱动.
138
+ """
139
+ """
140
+ funboost 有能力消费canal发到kafka的binlog消息,也能不依赖canal,自己捕获cdc数据
141
+ """
142
+ MYSQL_CDC = 'MYSQL_CDC'
143
+
144
+
122
145
 
123
146
  class ConcurrentModeEnum:
124
147
  THREADING = 'threading' # 线程方式运行,兼容支持 async def 的异步函数。
@@ -637,10 +637,13 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
637
637
  """
638
638
  self._do_not_delete_extra_from_msg = True
639
639
 
640
- def user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus): # 这个可以继承
640
+ def _frame_custom_record_process_info_func(self,current_function_result_status: FunctionResultStatus,kw:dict):
641
641
  pass
642
642
 
643
- async def aio_user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus): # 这个可以继承
643
+ def user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus,): # 这个可以继承
644
+ pass
645
+
646
+ async def aio_user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus,): # 这个可以继承
644
647
  pass
645
648
 
646
649
  def _convert_real_function_only_params_by_conusuming_function_kind(self, function_only_params: dict,extra_params:dict):
@@ -729,9 +732,10 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
729
732
 
730
733
  with self._lock_for_count_execute_task_times_every_unit_time:
731
734
  self.metric_calculation.cal(t_start_run_fun,current_function_result_status)
732
- self.user_custom_record_process_info_func(current_function_result_status) # 两种方式都可以自定义,记录结果,建议继承方式,不使用boost中指定 user_custom_record_process_info_func
735
+ self._frame_custom_record_process_info_func(current_function_result_status,kw)
736
+ self.user_custom_record_process_info_func(current_function_result_status,) # 两种方式都可以自定义,记录结果,建议继承方式,不使用boost中指定 user_custom_record_process_info_func
733
737
  if self.consumer_params.user_custom_record_process_info_func:
734
- self.consumer_params.user_custom_record_process_info_func(current_function_result_status)
738
+ self.consumer_params.user_custom_record_process_info_func(current_function_result_status,)
735
739
  except BaseException as e:
736
740
  log_msg = f' error 严重错误 {type(e)} {e} '
737
741
  # self.logger.critical(msg=f'{log_msg} \n', exc_info=True)
@@ -888,10 +892,11 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
888
892
  async with self._async_lock_for_count_execute_task_times_every_unit_time:
889
893
  self.metric_calculation.cal(t_start_run_fun, current_function_result_status)
890
894
 
891
- self.user_custom_record_process_info_func(current_function_result_status) # 两种方式都可以自定义,记录结果.建议使用文档4.21.b的方式继承来重写
892
- await self.aio_user_custom_record_process_info_func(current_function_result_status)
895
+ self._frame_custom_record_process_info_func(current_function_result_status)
896
+ self.user_custom_record_process_info_func(current_function_result_status,) # 两种方式都可以自定义,记录结果.建议使用文档4.21.b的方式继承来重写
897
+ await self.aio_user_custom_record_process_info_func(current_function_result_status,)
893
898
  if self.consumer_params.user_custom_record_process_info_func:
894
- self.consumer_params.user_custom_record_process_info_func(current_function_result_status)
899
+ self.consumer_params.user_custom_record_process_info_func(current_function_result_status,)
895
900
 
896
901
  except BaseException as e:
897
902
  log_msg = f' error 严重错误 {type(e)} {e} '
@@ -1126,7 +1131,9 @@ class ConcurrentModeDispatcher(FunboostFileLoggerMixin):
1126
1131
  # pool_type = ProcessPoolExecutor
1127
1132
  if self._concurrent_mode == ConcurrentModeEnum.ASYNC:
1128
1133
  self.consumer._concurrent_pool = self.consumer.consumer_params.specify_concurrent_pool or pool_type(
1129
- self.consumer.consumer_params.concurrent_num, loop=self.consumer.consumer_params.specify_async_loop)
1134
+ self.consumer.consumer_params.concurrent_num,
1135
+ specify_async_loop=self.consumer.consumer_params.specify_async_loop,
1136
+ is_auto_start_specify_async_loop_in_child_thread=self.consumer.consumer_params.is_auto_start_specify_async_loop_in_child_thread)
1130
1137
  else:
1131
1138
  # print(pool_type)
1132
1139
  self.consumer._concurrent_pool = self.consumer.consumer_params.specify_concurrent_pool or pool_type(self.consumer.consumer_params.concurrent_num)
@@ -0,0 +1,102 @@
1
+ # -*- coding: utf-8 -*-
2
+ # @Author : ydf
3
+ # @Time : 2023/8/8 0008 13:32
4
+
5
+ import abc
6
+ import threading
7
+ import grpc
8
+ import time
9
+
10
+ from funboost import FunctionResultStatus
11
+ from funboost.assist.grpc_helper import funboost_grpc_pb2_grpc, funboost_grpc_pb2
12
+ from funboost.consumers.base_consumer import AbstractConsumer
13
+ from funboost.core.serialization import Serialization
14
+ from funboost.core.exceptions import FunboostWaitRpcResultTimeout
15
+ from funboost.concurrent_pool.flexible_thread_pool import FlexibleThreadPool
16
+
17
+
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
+
37
+
38
+
39
+ class GrpcConsumer(AbstractConsumer, ):
40
+ """
41
+ grpc as broker
42
+ """
43
+ BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'host': '127.0.0.1', 'port': None}
44
+
45
+ def custom_init(self):
46
+ class FunboostGrpcServicer(funboost_grpc_pb2_grpc.FunboostBrokerServiceServicer):
47
+ """
48
+ HelloService 的实现类
49
+ """
50
+
51
+ def Call(this, request, context):
52
+ """
53
+ 实现 SayHello 方法
54
+ """
55
+ future_status_result = FutureStatusResult(call_type=request.call_type)
56
+ kw = {'body': request.json_req, 'future_status_result': future_status_result,}
57
+ self._submit_task(kw)
58
+ if request.call_type =="sync_call":
59
+ if future_status_result.wait_finish(self.consumer_params.rpc_timeout): # 等待并发出的消费结果
60
+ return funboost_grpc_pb2.FunboostGrpcResponse(json_resp=Serialization.to_json_str(
61
+ future_status_result.get_staus_result_obj().get_status_dict(without_datetime_obj=True)))
62
+ else:
63
+ self.logger.error(f'wait rpc data timeout')
64
+ context.set_code(grpc.StatusCode.DEADLINE_EXCEEDED)
65
+ context.set_details(f'wait rpc data timeout')
66
+ # raise FunboostWaitRpcResultTimeout(f'wait rpc data timeout')
67
+ else:
68
+ return funboost_grpc_pb2.FunboostGrpcResponse(json_resp='{"publish_status":"ok"}')
69
+
70
+ self.GRPC_SERVICER_CLS = FunboostGrpcServicer
71
+
72
+ def _shedual_task(self):
73
+ server = grpc.server(self.concurrent_pool)
74
+
75
+ # 添加服务
76
+ funboost_grpc_pb2_grpc.add_FunboostBrokerServiceServicer_to_server(self.GRPC_SERVICER_CLS(), server)
77
+
78
+ # 绑定端口
79
+ port = self.consumer_params.broker_exclusive_config['port']
80
+ if port is None:
81
+ raise ValueError('please specify port')
82
+ listen_addr = f'[::]:{port}'
83
+ server.add_insecure_port(listen_addr)
84
+
85
+ # 启动服务器
86
+ server.start()
87
+ print(f"GRPC Has started. listening on: {listen_addr}")
88
+
89
+ while True:
90
+ time.sleep(100) # 保持服务器运行
91
+
92
+ def _confirm_consume(self, kw):
93
+ pass
94
+
95
+ def _requeue(self, kw):
96
+ pass
97
+
98
+ def _frame_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus, kw):
99
+ future_status_result: FutureStatusResult = kw['future_status_result']
100
+ if future_status_result.call_type == "sync_call":
101
+ future_status_result.set_staus_result_obj(current_function_result_status)
102
+ future_status_result.set_finish() # 这是最重要最核心的, 并发池里面处理函数完成,马上告诉grpc服务端,已经处理完成.
@@ -22,7 +22,7 @@ class KafkaConsumer(AbstractConsumer):
22
22
  可以让消费函数内部 sleep60秒,突然停止消费代码,使用 kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --describe --group funboost 来证实自动确认消费和手动确认消费的区别。
23
23
  """
24
24
 
25
- BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'group_id': 'funboost_kafka', 'auto_offset_reset': 'earliest'}
25
+ BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'group_id': 'funboost_kafka', 'auto_offset_reset': 'earliest','num_partitions':10,'replication_factor':1,}
26
26
  # not_all_brokers_general_settings配置 ,支持独立的中间件配置参数是 group_id 和 auto_offset_reset
27
27
  """
28
28
  auto_offset_reset 介绍
@@ -35,7 +35,9 @@ class KafkaConsumer(AbstractConsumer):
35
35
  def _shedual_task(self):
36
36
  try:
37
37
  admin_client = KafkaPythonImporter().KafkaAdminClient(bootstrap_servers=BrokerConnConfig.KAFKA_BOOTSTRAP_SERVERS)
38
- admin_client.create_topics([KafkaPythonImporter().NewTopic(self._queue_name, 10, 1)])
38
+ admin_client.create_topics([KafkaPythonImporter().NewTopic(self._queue_name,
39
+ self.consumer_params.broker_exclusive_config['num_partitions'],
40
+ self.consumer_params.broker_exclusive_config['replication_factor'])])
39
41
  # admin_client.create_partitions({self._queue_name: NewPartitions(total_count=16)})
40
42
  except KafkaPythonImporter().TopicAlreadyExistsError:
41
43
  pass