funboost 45.3__tar.gz → 45.4__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 (290) hide show
  1. {funboost-45.3/funboost.egg-info → funboost-45.4}/PKG-INFO +1 -1
  2. {funboost-45.3 → funboost-45.4}/funboost/__init__.py +2 -2
  3. funboost-45.4/funboost/assist/faststream_helper.py +18 -0
  4. funboost-45.4/funboost/assist/taskiq_helper.py +1 -0
  5. {funboost-45.3 → funboost-45.4}/funboost/consumers/base_consumer.py +10 -11
  6. {funboost-45.3 → funboost-45.4}/funboost/consumers/confirm_mixin.py +2 -2
  7. funboost-45.4/funboost/consumers/faststream_consumer.py +54 -0
  8. {funboost-45.3 → funboost-45.4}/funboost/consumers/redis_consumer.py +2 -2
  9. {funboost-45.3 → funboost-45.4}/funboost/consumers/redis_consumer_ack_using_timeout.py +2 -2
  10. {funboost-45.3 → funboost-45.4}/funboost/consumers/redis_consumer_simple.py +2 -1
  11. {funboost-45.3 → funboost-45.4}/funboost/consumers/redis_filter.py +2 -2
  12. {funboost-45.3 → funboost-45.4}/funboost/core/function_result_status_saver.py +5 -3
  13. {funboost-45.3 → funboost-45.4}/funboost/core/msg_result_getter.py +3 -3
  14. funboost-45.4/funboost/core/serialization.py +16 -0
  15. {funboost-45.3 → funboost-45.4}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +14 -6
  16. {funboost-45.3 → funboost-45.4}/funboost/publishers/base_publisher.py +28 -17
  17. funboost-45.4/funboost/publishers/faststream_publisher.py +57 -0
  18. {funboost-45.3 → funboost-45.4}/funboost/publishers/local_python_queue_publisher.py +1 -0
  19. {funboost-45.3 → funboost-45.4}/funboost/utils/json_helper.py +14 -14
  20. {funboost-45.3 → funboost-45.4/funboost.egg-info}/PKG-INFO +1 -1
  21. {funboost-45.3 → funboost-45.4}/funboost.egg-info/SOURCES.txt +5 -0
  22. {funboost-45.3 → funboost-45.4}/funboost.egg-info/requires.txt +1 -0
  23. {funboost-45.3 → funboost-45.4}/setup.py +2 -1
  24. {funboost-45.3 → funboost-45.4}/LICENSE +0 -0
  25. {funboost-45.3 → funboost-45.4}/MANIFEST.in +0 -0
  26. {funboost-45.3 → funboost-45.4}/README.md +0 -0
  27. {funboost-45.3 → funboost-45.4}/funboost/__init__old.py +0 -0
  28. {funboost-45.3 → funboost-45.4}/funboost/__main__.py +0 -0
  29. {funboost-45.3 → funboost-45.4}/funboost/assist/__init__.py +0 -0
  30. {funboost-45.3 → funboost-45.4}/funboost/assist/celery_helper.py +0 -0
  31. {funboost-45.3 → funboost-45.4}/funboost/assist/dramatiq_helper.py +0 -0
  32. {funboost-45.3 → funboost-45.4}/funboost/assist/huey_helper.py +0 -0
  33. {funboost-45.3 → funboost-45.4}/funboost/assist/rocketry_helper.py +0 -0
  34. {funboost-45.3 → funboost-45.4}/funboost/assist/rq_helper.py +0 -0
  35. {funboost-45.3 → funboost-45.4}/funboost/assist/rq_windows_worker.py +0 -0
  36. {funboost-45.3 → funboost-45.4}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
  37. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/__init__.py +0 -0
  38. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/async_helper.py +0 -0
  39. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/async_pool_executor.py +0 -0
  40. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/backup/__init__.py +0 -0
  41. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
  42. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
  43. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
  44. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/base_pool_type.py +0 -0
  45. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
  46. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
  47. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
  48. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
  49. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
  50. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
  51. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
  52. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
  53. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
  54. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
  55. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/pool_commons.py +0 -0
  56. {funboost-45.3 → funboost-45.4}/funboost/concurrent_pool/single_thread_executor.py +0 -0
  57. {funboost-45.3 → funboost-45.4}/funboost/constant.py +0 -0
  58. {funboost-45.3 → funboost-45.4}/funboost/consumers/__init__.py +0 -0
  59. {funboost-45.3 → funboost-45.4}/funboost/consumers/celery_consumer.py +0 -0
  60. {funboost-45.3 → funboost-45.4}/funboost/consumers/dramatiq_consumer.py +0 -0
  61. {funboost-45.3 → funboost-45.4}/funboost/consumers/empty_consumer.py +0 -0
  62. {funboost-45.3 → funboost-45.4}/funboost/consumers/http_consumer.py +0 -0
  63. {funboost-45.3 → funboost-45.4}/funboost/consumers/http_consumer000.py +0 -0
  64. {funboost-45.3 → funboost-45.4}/funboost/consumers/httpsqs_consumer.py +0 -0
  65. {funboost-45.3 → funboost-45.4}/funboost/consumers/huey_consumer.py +0 -0
  66. {funboost-45.3 → funboost-45.4}/funboost/consumers/kafka_consumer.py +0 -0
  67. {funboost-45.3 → funboost-45.4}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
  68. {funboost-45.3 → funboost-45.4}/funboost/consumers/kombu_consumer.py +0 -0
  69. {funboost-45.3 → funboost-45.4}/funboost/consumers/local_python_queue_consumer.py +0 -0
  70. {funboost-45.3 → funboost-45.4}/funboost/consumers/memory_deque_consumer.py +0 -0
  71. {funboost-45.3 → funboost-45.4}/funboost/consumers/mongomq_consumer.py +0 -0
  72. {funboost-45.3 → funboost-45.4}/funboost/consumers/mqtt_consumer.py +0 -0
  73. {funboost-45.3 → funboost-45.4}/funboost/consumers/nameko_consumer.py +0 -0
  74. {funboost-45.3 → funboost-45.4}/funboost/consumers/nats_consumer.py +0 -0
  75. {funboost-45.3 → funboost-45.4}/funboost/consumers/nsq_consumer.py +0 -0
  76. {funboost-45.3 → funboost-45.4}/funboost/consumers/peewee_conusmer.py +0 -0
  77. {funboost-45.3 → funboost-45.4}/funboost/consumers/persist_queue_consumer.py +0 -0
  78. {funboost-45.3 → funboost-45.4}/funboost/consumers/pulsar_consumer.py +0 -0
  79. {funboost-45.3 → funboost-45.4}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
  80. {funboost-45.3 → funboost-45.4}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
  81. {funboost-45.3 → funboost-45.4}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
  82. {funboost-45.3 → funboost-45.4}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
  83. {funboost-45.3 → funboost-45.4}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
  84. {funboost-45.3 → funboost-45.4}/funboost/consumers/redis_consumer_ack_able.py +0 -0
  85. {funboost-45.3 → funboost-45.4}/funboost/consumers/redis_consumer_priority.py +0 -0
  86. {funboost-45.3 → funboost-45.4}/funboost/consumers/redis_pubsub_consumer.py +0 -0
  87. {funboost-45.3 → funboost-45.4}/funboost/consumers/redis_stream_consumer.py +0 -0
  88. {funboost-45.3 → funboost-45.4}/funboost/consumers/rocketmq_consumer.py +0 -0
  89. {funboost-45.3 → funboost-45.4}/funboost/consumers/rq_consumer.py +0 -0
  90. {funboost-45.3 → funboost-45.4}/funboost/consumers/sqlachemy_consumer.py +0 -0
  91. {funboost-45.3 → funboost-45.4}/funboost/consumers/tcp_consumer.py +0 -0
  92. {funboost-45.3 → funboost-45.4}/funboost/consumers/txt_file_consumer.py +0 -0
  93. {funboost-45.3 → funboost-45.4}/funboost/consumers/udp_consumer.py +0 -0
  94. {funboost-45.3 → funboost-45.4}/funboost/consumers/zeromq_consumer.py +0 -0
  95. {funboost-45.3 → funboost-45.4}/funboost/contrib/__init__.py +0 -0
  96. {funboost-45.3 → funboost-45.4}/funboost/contrib/api_publish_msg.py +0 -0
  97. {funboost-45.3 → funboost-45.4}/funboost/contrib/django_db_deco.py +0 -0
  98. {funboost-45.3 → funboost-45.4}/funboost/contrib/queue2queue.py +0 -0
  99. {funboost-45.3 → funboost-45.4}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
  100. {funboost-45.3 → funboost-45.4}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
  101. {funboost-45.3 → funboost-45.4}/funboost/core/__init__.py +0 -0
  102. {funboost-45.3 → funboost-45.4}/funboost/core/active_cousumer_info_getter.py +0 -0
  103. {funboost-45.3 → funboost-45.4}/funboost/core/booster.py +0 -0
  104. {funboost-45.3 → funboost-45.4}/funboost/core/cli/__init__.py +0 -0
  105. {funboost-45.3 → funboost-45.4}/funboost/core/cli/discovery_boosters.py +0 -0
  106. {funboost-45.3 → funboost-45.4}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
  107. {funboost-45.3 → funboost-45.4}/funboost/core/cli/funboost_fire.py +0 -0
  108. {funboost-45.3 → funboost-45.4}/funboost/core/current_task.py +0 -0
  109. {funboost-45.3 → funboost-45.4}/funboost/core/exceptions.py +0 -0
  110. {funboost-45.3 → funboost-45.4}/funboost/core/fabric_deploy_helper.py +0 -0
  111. {funboost-45.3 → funboost-45.4}/funboost/core/funboost_config_getter.py +0 -0
  112. {funboost-45.3 → funboost-45.4}/funboost/core/funboost_time.py +0 -0
  113. {funboost-45.3 → funboost-45.4}/funboost/core/func_params_model.py +0 -0
  114. {funboost-45.3 → funboost-45.4}/funboost/core/function_result_status_config.py +0 -0
  115. {funboost-45.3 → funboost-45.4}/funboost/core/helper_funs.py +0 -0
  116. {funboost-45.3 → funboost-45.4}/funboost/core/kill_remote_task.py +0 -0
  117. {funboost-45.3 → funboost-45.4}/funboost/core/lazy_impoter.py +0 -0
  118. {funboost-45.3 → funboost-45.4}/funboost/core/loggers.py +0 -0
  119. {funboost-45.3 → funboost-45.4}/funboost/core/muliti_process_enhance.py +0 -0
  120. {funboost-45.3 → funboost-45.4}/funboost/core/task_id_logger.py +0 -0
  121. {funboost-45.3 → funboost-45.4}/funboost/factories/__init__.py +0 -0
  122. {funboost-45.3 → funboost-45.4}/funboost/factories/consumer_factory.py +0 -0
  123. {funboost-45.3 → funboost-45.4}/funboost/factories/publisher_factotry.py +0 -0
  124. {funboost-45.3 → funboost-45.4}/funboost/funboost_config_deafult.py +0 -0
  125. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
  126. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  127. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/app.py +0 -0
  128. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/functions.py +0 -0
  129. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/assets/css/custom.css +0 -0
  130. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
  131. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
  132. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/assets/js/custom.js +0 -0
  133. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
  134. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/css/style.css +0 -0
  135. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/images/bg.jpg +0 -0
  136. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/images/password.png +0 -0
  137. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/images/tick.png +0 -0
  138. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/images/user.png +0 -0
  139. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
  140. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/templates/index.html +0 -0
  141. {funboost-45.3 → funboost-45.4}/funboost/function_result_web/templates/login.html +0 -0
  142. {funboost-45.3 → funboost-45.4}/funboost/publishers/__init__.py +0 -0
  143. {funboost-45.3 → funboost-45.4}/funboost/publishers/celery_publisher.py +0 -0
  144. {funboost-45.3 → funboost-45.4}/funboost/publishers/celery_publisher000.py +0 -0
  145. {funboost-45.3 → funboost-45.4}/funboost/publishers/confluent_kafka_publisher.py +0 -0
  146. {funboost-45.3 → funboost-45.4}/funboost/publishers/dramatiq_publisher.py +0 -0
  147. {funboost-45.3 → funboost-45.4}/funboost/publishers/empty_publisher.py +0 -0
  148. {funboost-45.3 → funboost-45.4}/funboost/publishers/http_publisher.py +0 -0
  149. {funboost-45.3 → funboost-45.4}/funboost/publishers/httpsqs_publisher.py +0 -0
  150. {funboost-45.3 → funboost-45.4}/funboost/publishers/huey_publisher.py +0 -0
  151. {funboost-45.3 → funboost-45.4}/funboost/publishers/kafka_publisher.py +0 -0
  152. {funboost-45.3 → funboost-45.4}/funboost/publishers/kombu_publisher.py +0 -0
  153. {funboost-45.3 → funboost-45.4}/funboost/publishers/meomory_deque_publisher.py +0 -0
  154. {funboost-45.3 → funboost-45.4}/funboost/publishers/mongomq_publisher.py +0 -0
  155. {funboost-45.3 → funboost-45.4}/funboost/publishers/mqtt_publisher.py +0 -0
  156. {funboost-45.3 → funboost-45.4}/funboost/publishers/nameko_publisher.py +0 -0
  157. {funboost-45.3 → funboost-45.4}/funboost/publishers/nats_publisher.py +0 -0
  158. {funboost-45.3 → funboost-45.4}/funboost/publishers/nsq_publisher.py +0 -0
  159. {funboost-45.3 → funboost-45.4}/funboost/publishers/peewee_publisher.py +0 -0
  160. {funboost-45.3 → funboost-45.4}/funboost/publishers/persist_queue_publisher.py +0 -0
  161. {funboost-45.3 → funboost-45.4}/funboost/publishers/pulsar_publisher.py +0 -0
  162. {funboost-45.3 → funboost-45.4}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
  163. {funboost-45.3 → funboost-45.4}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
  164. {funboost-45.3 → funboost-45.4}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
  165. {funboost-45.3 → funboost-45.4}/funboost/publishers/redis_publisher.py +0 -0
  166. {funboost-45.3 → funboost-45.4}/funboost/publishers/redis_publisher_lpush.py +0 -0
  167. {funboost-45.3 → funboost-45.4}/funboost/publishers/redis_publisher_priority.py +0 -0
  168. {funboost-45.3 → funboost-45.4}/funboost/publishers/redis_publisher_simple.py +0 -0
  169. {funboost-45.3 → funboost-45.4}/funboost/publishers/redis_pubsub_publisher.py +0 -0
  170. {funboost-45.3 → funboost-45.4}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
  171. {funboost-45.3 → funboost-45.4}/funboost/publishers/redis_stream_publisher.py +0 -0
  172. {funboost-45.3 → funboost-45.4}/funboost/publishers/rocketmq_publisher.py +0 -0
  173. {funboost-45.3 → funboost-45.4}/funboost/publishers/rq_publisher.py +0 -0
  174. {funboost-45.3 → funboost-45.4}/funboost/publishers/sqla_queue_publisher.py +0 -0
  175. {funboost-45.3 → funboost-45.4}/funboost/publishers/tcp_publisher.py +0 -0
  176. {funboost-45.3 → funboost-45.4}/funboost/publishers/txt_file_publisher.py +0 -0
  177. {funboost-45.3 → funboost-45.4}/funboost/publishers/udp_publisher.py +0 -0
  178. {funboost-45.3 → funboost-45.4}/funboost/publishers/zeromq_publisher.py +0 -0
  179. {funboost-45.3 → funboost-45.4}/funboost/queues/__init__.py +0 -0
  180. {funboost-45.3 → funboost-45.4}/funboost/queues/peewee_queue.py +0 -0
  181. {funboost-45.3 → funboost-45.4}/funboost/queues/sqla_queue.py +0 -0
  182. {funboost-45.3 → funboost-45.4}/funboost/set_frame_config.py +0 -0
  183. {funboost-45.3 → funboost-45.4}/funboost/timing_job/__init__.py +0 -0
  184. {funboost-45.3 → funboost-45.4}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
  185. {funboost-45.3 → funboost-45.4}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
  186. {funboost-45.3 → funboost-45.4}/funboost/utils/__init__.py +0 -0
  187. {funboost-45.3 → funboost-45.4}/funboost/utils/apscheduler_monkey.py +0 -0
  188. {funboost-45.3 → funboost-45.4}/funboost/utils/block_exit.py +0 -0
  189. {funboost-45.3 → funboost-45.4}/funboost/utils/bulk_operation.py +0 -0
  190. {funboost-45.3 → funboost-45.4}/funboost/utils/class_utils.py +0 -0
  191. {funboost-45.3 → funboost-45.4}/funboost/utils/ctrl_c_end.py +0 -0
  192. {funboost-45.3 → funboost-45.4}/funboost/utils/custom_pysnooper.py +0 -0
  193. {funboost-45.3 → funboost-45.4}/funboost/utils/decorators.py +0 -0
  194. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages/__init__.py +0 -0
  195. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
  196. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
  197. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
  198. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
  199. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
  200. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
  201. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
  202. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
  203. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
  204. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  205. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
  206. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
  207. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  208. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
  209. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
  210. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
  211. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
  212. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
  213. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
  214. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
  215. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
  216. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
  217. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
  218. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  219. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
  220. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
  221. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
  222. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
  223. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
  224. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
  225. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
  226. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
  227. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
  228. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
  229. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
  230. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
  231. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
  232. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
  233. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
  234. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
  235. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
  236. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
  237. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
  238. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
  239. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
  240. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
  241. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
  242. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
  243. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
  244. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
  245. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
  246. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
  247. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
  248. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
  249. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
  250. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
  251. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
  252. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
  253. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
  254. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
  255. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
  256. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
  257. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
  258. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
  259. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
  260. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
  261. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
  262. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
  263. {funboost-45.3 → funboost-45.4}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
  264. {funboost-45.3 → funboost-45.4}/funboost/utils/develop_log.py +0 -0
  265. {funboost-45.3 → funboost-45.4}/funboost/utils/expire_lock.py +0 -0
  266. {funboost-45.3 → funboost-45.4}/funboost/utils/mongo_util.py +0 -0
  267. {funboost-45.3 → funboost-45.4}/funboost/utils/monkey_color_log.py +0 -0
  268. {funboost-45.3 → funboost-45.4}/funboost/utils/monkey_patches.py +0 -0
  269. {funboost-45.3 → funboost-45.4}/funboost/utils/mqtt_util.py +0 -0
  270. {funboost-45.3 → funboost-45.4}/funboost/utils/paramiko_util.py +0 -0
  271. {funboost-45.3 → funboost-45.4}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
  272. {funboost-45.3 → funboost-45.4}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
  273. {funboost-45.3 → funboost-45.4}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
  274. {funboost-45.3 → funboost-45.4}/funboost/utils/pysnooper_ydf/utils.py +0 -0
  275. {funboost-45.3 → funboost-45.4}/funboost/utils/pysnooper_ydf/variables.py +0 -0
  276. {funboost-45.3 → funboost-45.4}/funboost/utils/rabbitmq_factory.py +0 -0
  277. {funboost-45.3 → funboost-45.4}/funboost/utils/redis_manager.py +0 -0
  278. {funboost-45.3 → funboost-45.4}/funboost/utils/redis_manager_old.py +0 -0
  279. {funboost-45.3 → funboost-45.4}/funboost/utils/resource_monitoring.py +0 -0
  280. {funboost-45.3 → funboost-45.4}/funboost/utils/restart_python.py +0 -0
  281. {funboost-45.3 → funboost-45.4}/funboost/utils/simple_data_class.py +0 -0
  282. {funboost-45.3 → funboost-45.4}/funboost/utils/str_utils.py +0 -0
  283. {funboost-45.3 → funboost-45.4}/funboost/utils/time_util.py +0 -0
  284. {funboost-45.3 → funboost-45.4}/funboost/utils/times/__init__.py +0 -0
  285. {funboost-45.3 → funboost-45.4}/funboost/utils/times/version.py +0 -0
  286. {funboost-45.3 → funboost-45.4}/funboost/utils/un_strict_json_dumps.py +0 -0
  287. {funboost-45.3 → funboost-45.4}/funboost.egg-info/dependency_links.txt +0 -0
  288. {funboost-45.3 → funboost-45.4}/funboost.egg-info/entry_points.txt +0 -0
  289. {funboost-45.3 → funboost-45.4}/funboost.egg-info/top_level.txt +0 -0
  290. {funboost-45.3 → funboost-45.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 45.3
3
+ Version: 45.4
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -13,7 +13,7 @@ set_frame_config这个模块的 use_config_form_funboost_config_module() 是核
13
13
  这段注释说明和使用的用户无关,只和框架开发人员有关.
14
14
  '''
15
15
 
16
- __version__ = "45.3"
16
+ __version__ = "45.4"
17
17
 
18
18
  from funboost.set_frame_config import show_frame_config
19
19
 
@@ -65,5 +65,5 @@ from funboost.core.current_task import funboost_current_task
65
65
  # set_interrupt_signal_handler()
66
66
 
67
67
  # 有的包默认没加handlers,原始的日志不漂亮且不可跳转不知道哪里发生的。这里把warnning级别以上的日志默认加上handlers。
68
- # nb_log.get_logger(name='', log_level_int=30, _log_filename='pywarning.log')
68
+ # nb_log.get_logger(name='', log_level_int=30, log_filename='pywarning.log')
69
69
 
@@ -0,0 +1,18 @@
1
+ import asyncio
2
+
3
+ from faststream import FastStream
4
+ from faststream.rabbit import RabbitBroker
5
+ from funboost.funboost_config_deafult import BrokerConnConfig
6
+ from funboost.core.loggers import get_funboost_file_logger
7
+
8
+ get_funboost_file_logger('faststream.access.rabbit')
9
+
10
+ broker = RabbitBroker(BrokerConnConfig.RABBITMQ_URL, max_consumers=20)
11
+ app = FastStream(broker)
12
+
13
+ # asyncio.get_event_loop().run_until_complete(broker.connect())
14
+ #
15
+ # asyncio.get_event_loop().run_until_complete(broker.start())
16
+
17
+ def get_broker(max_consumers=None):
18
+ return RabbitBroker(BrokerConnConfig.RABBITMQ_URL, max_consumers=max_consumers)
@@ -35,9 +35,10 @@ from funboost.core.current_task import funboost_current_task, FctContext
35
35
  from funboost.core.loggers import develop_logger
36
36
 
37
37
  from funboost.core.func_params_model import BoosterParams, PublisherParams, BaseJsonAbleModel
38
+ from funboost.core.serialization import Serialization
38
39
  from funboost.core.task_id_logger import TaskIdLogger
39
40
  from funboost.constant import FunctionKind
40
- from funboost.utils.json_helper import JsonUtils
41
+
41
42
  from nb_libs.path_helper import PathHelper
42
43
  from nb_log import (get_logger, LoggerLevelSetterMixin, LogManager, is_main_process,
43
44
  nb_log_config_default)
@@ -139,7 +140,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
139
140
  if consumer_params.consuming_function is None:
140
141
  raise ValueError('必须传 consuming_function 参数')
141
142
 
142
- self._msg_schedule_time_intercal = 0 if consumer_params.qps is None else 1.0 / consumer_params.qps
143
+ self._msg_schedule_time_intercal = 0 if consumer_params.qps in (None,0) else 1.0 / consumer_params.qps
143
144
 
144
145
  self._concurrent_mode_dispatcher = ConcurrentModeDispatcher(self)
145
146
  if consumer_params.concurrent_mode == ConcurrentModeEnum.ASYNC:
@@ -408,8 +409,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
408
409
  extra_params = {'task_id': task_id, 'publish_time': round(time.time(), 4),
409
410
  'publish_time_format': time.strftime('%Y-%m-%d %H:%M:%S')}
410
411
  """
411
- if isinstance(msg, str):
412
- msg = json.loads(msg)
412
+ msg = Serialization.to_dict(msg)
413
413
  # 以下是清洗补全字段.
414
414
  if 'extra' not in msg:
415
415
  msg['extra'] = {'is_auto_fill_extra': True}
@@ -536,7 +536,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
536
536
  # print(999)
537
537
  if self.consumer_params.is_show_message_get_from_broker:
538
538
  # self.logger.debug(f'从 {broker_name} 中间件 的 {self._queue_name} 中取出的消息是 {msg}')
539
- self.logger.debug(f'从 {broker_name or self.consumer_params.broker_kind} 中间件 的 {self._queue_name} 中取出的消息是 {JsonUtils.to_json_str(msg)}')
539
+ self.logger.debug(f'从 {broker_name or self.consumer_params.broker_kind} 中间件 的 {self._queue_name} 中取出的消息是 {Serialization.to_json_str(msg)}')
540
540
 
541
541
  def _get_priority_conf(self, kw: dict, broker_task_config_key: str):
542
542
  broker_task_config = kw['body'].get('extra', {}).get(broker_task_config_key, None)
@@ -585,7 +585,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
585
585
  # method_cls = getattr(sys.modules[self.consumer_params.consuming_function_class_module],
586
586
  # self.consumer_params.consuming_function_class_name)
587
587
  if self.publisher_params.consuming_function_kind == FunctionKind.CLASS_METHOD:
588
- method_cls = getattr(PathHelper(method_first_param_value[ConstStrForClassMethod.CLS_FILE]).import_as_module(),method_first_param_value[ConstStrForClassMethod.CLS_NAME])
588
+ method_cls = getattr(PathHelper(method_first_param_value[ConstStrForClassMethod.CLS_FILE]).import_as_module(), method_first_param_value[ConstStrForClassMethod.CLS_NAME])
589
589
  real_function_only_params[method_first_param_name] = method_cls
590
590
  elif self.publisher_params.consuming_function_kind == FunctionKind.INSTANCE_METHOD:
591
591
  method_cls = getattr(PathHelper(method_first_param_value[ConstStrForClassMethod.CLS_FILE]).import_as_module(), method_first_param_value[ConstStrForClassMethod.CLS_NAME])
@@ -642,7 +642,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
642
642
  # RedisMixin().redis_db_frame.expire(kw['body']['extra']['task_id'], 600)
643
643
  current_function_result_status.rpc_result_expire_seconds = self.consumer_params.rpc_result_expire_seconds
644
644
  p.lpush(kw['body']['extra']['task_id'],
645
- json.dumps(current_function_result_status.get_status_dict(without_datetime_obj=True)))
645
+ Serialization.to_json_str(current_function_result_status.get_status_dict(without_datetime_obj=True)))
646
646
  p.expire(kw['body']['extra']['task_id'], self.consumer_params.rpc_result_expire_seconds)
647
647
  p.execute()
648
648
 
@@ -812,7 +812,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
812
812
  with RedisMixin().redis_db_filter_and_rpc_result.pipeline() as p:
813
813
  current_function_result_status.rpc_result_expire_seconds = self.consumer_params.rpc_result_expire_seconds
814
814
  p.lpush(kw['body']['extra']['task_id'],
815
- json.dumps(current_function_result_status.get_status_dict(without_datetime_obj=True)))
815
+ Serialization.to_json_str(current_function_result_status.get_status_dict(without_datetime_obj=True)))
816
816
  p.expire(kw['body']['extra']['task_id'], self.consumer_params.rpc_result_expire_seconds)
817
817
  p.execute()
818
818
 
@@ -852,7 +852,6 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
852
852
  fct = funboost_current_task()
853
853
  fct.set_fct_context(None)
854
854
 
855
-
856
855
  # noinspection PyProtectedMember
857
856
  async def _async_run_consuming_function_with_confirm_and_retry(self, kw: dict, current_retry_times,
858
857
  function_result_status: FunctionResultStatus, ):
@@ -1161,14 +1160,14 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
1161
1160
  results = self.redis_db_frame.smembers(redis_key)
1162
1161
  with self.redis_db_frame.pipeline() as p:
1163
1162
  for result in results:
1164
- result_dict = json.loads(result)
1163
+ result_dict = Serialization.to_dict(result)
1165
1164
  if self.timestamp() - result_dict['hearbeat_timestamp'] > 15 \
1166
1165
  or self._consumer_identification_map['consumer_uuid'] == result_dict['consumer_uuid']:
1167
1166
  # 因为这个是10秒钟运行一次,15秒还没更新,那肯定是掉线了。如果消费者本身是自己也先删除。
1168
1167
  p.srem(redis_key, result)
1169
1168
  self._consumer_identification_map['hearbeat_datetime_str'] = time_util.DatetimeConverter().datetime_str
1170
1169
  self._consumer_identification_map['hearbeat_timestamp'] = self.timestamp()
1171
- value = json.dumps(self._consumer_identification_map, sort_keys=True)
1170
+ value = Serialization.to_json_str(self._consumer_identification_map, )
1172
1171
  p.sadd(redis_key, value)
1173
1172
  p.execute()
1174
1173
 
@@ -5,7 +5,7 @@ import json
5
5
  import time
6
6
  from funboost.utils.redis_manager import RedisMixin
7
7
  from funboost.utils import decorators
8
-
8
+ from funboost.core.serialization import Serialization
9
9
  """
10
10
  此模块是依赖redis的确认消费,所以比较复杂。
11
11
  """
@@ -46,7 +46,7 @@ class ConsumerConfirmMixinWithTheHelpOfRedis(RedisMixin):
46
46
  time_max = time.time() - self.UNCONFIRMED_TIMEOUT
47
47
  for value in self.redis_db_frame.zrangebyscore(self._unack_zset_name, 0, time_max):
48
48
  self.logger.warning(f'向 {self._queue_name} 重新放入未消费确认的任务 {value}')
49
- self._requeue({'body': json.loads(value)})
49
+ self._requeue({'body': Serialization.to_dict(value)})
50
50
  self.redis_db_frame.zrem(self._unack_zset_name, value)
51
51
  self.logger.info(f'{self._unack_zset_name} 中有待确认消费任务的数量是'
52
52
  f' {self.redis_db_frame.zcard(self._unack_zset_name)}')
@@ -0,0 +1,54 @@
1
+ import asyncio
2
+ import json
3
+ import threading
4
+ import time
5
+
6
+ from funboost import EmptyConsumer
7
+ from funboost.assist.faststream_helper import broker,app,get_broker
8
+ from faststream import FastStream,Context
9
+ from faststream.annotations import Logger
10
+
11
+ from funboost.concurrent_pool.async_helper import simple_run_in_executor
12
+ from funboost.core.helper_funs import delete_keys_and_return_new_dict
13
+
14
+
15
+ class FastStreamConsumer(EmptyConsumer):
16
+ def custom_init(self):
17
+ self.broker = get_broker(max_consumers=self.consumer_params.concurrent_num)
18
+ subc = self.broker.subscriber(self.queue_name)
19
+ # @broker.subscriber(self.queue_name)
20
+ async def f(msg:str, logger: Logger,message=Context(),broker=Context(),context=Context(),):
21
+ self.logger.debug(f' 这条消息是 faststream 从 {self.queue_name} 队列中取出 ,是由 faststream 框架调度 {self.consuming_function.__name__} 函数处理,msg:{message} {context}')
22
+ # print(logger.name)
23
+ # return self.consuming_function(*args, **kwargs) # 如果没有声明 autoretry_for ,那么消费函数出错了就不会自动重试了。
24
+ # print(msg)
25
+ function_only_params = delete_keys_and_return_new_dict(json.loads(msg))
26
+ if self._consuming_function_is_asyncio:
27
+ result = await self.consuming_function(**function_only_params)
28
+ else:
29
+ result = await simple_run_in_executor(self.consuming_function,**function_only_params)
30
+ # print(result)
31
+ return result
32
+ subc(f)
33
+ self.faststream_subscriber = subc
34
+
35
+ def _shedual_task(self):
36
+ """ 完全由faststream框架接管控制消费,不使用funboost的AbstractConsumer的_run"""
37
+ while 1:
38
+ time.sleep(100)
39
+
40
+
41
+ def _confirm_consume(self, kw):
42
+ pass
43
+
44
+ def start_consuming_message(self):
45
+ def _f():
46
+ loop = asyncio.new_event_loop()
47
+ loop.run_until_complete(self.broker.connect())
48
+ loop.run_until_complete(self.faststream_subscriber.start())
49
+ loop.run_forever()
50
+ self.keep_circulating(10, block=False)(_f)()
51
+ # threading.Thread(target=_f).start()
52
+
53
+ def _requeue(self, kw):
54
+ pass
@@ -10,7 +10,7 @@ import time
10
10
  from funboost.constant import BrokerEnum
11
11
  from funboost.consumers.base_consumer import AbstractConsumer
12
12
  from funboost.utils.redis_manager import RedisMixin
13
-
13
+ from funboost.core.serialization import Serialization
14
14
 
15
15
  class RedisConsumer(AbstractConsumer, RedisMixin):
16
16
  """
@@ -57,4 +57,4 @@ class RedisConsumer(AbstractConsumer, RedisMixin):
57
57
  pass # redis没有确认消费的功能。
58
58
 
59
59
  def _requeue(self, kw):
60
- self.redis_db_frame.rpush(self._queue_name, json.dumps(kw['body']))
60
+ self.redis_db_frame.rpush(self._queue_name,Serialization.to_json_str(kw['body']))
@@ -4,8 +4,8 @@
4
4
  import json
5
5
  import time
6
6
  from funboost.consumers.base_consumer import AbstractConsumer
7
+ from funboost.core.serialization import Serialization
7
8
  from funboost.utils.decorators import RedisDistributedLockContextManager
8
- from funboost.utils.json_helper import JsonUtils
9
9
  from funboost.utils.redis_manager import RedisMixin
10
10
 
11
11
 
@@ -40,7 +40,7 @@ class RedisConsumerAckUsingTimeout(AbstractConsumer, RedisMixin):
40
40
  self.redis_db_frame.zrem(self._unack_zset_name, kw['task_str'])
41
41
 
42
42
  def _requeue(self, kw):
43
- self.redis_db_frame.rpush(self._queue_name, JsonUtils.to_json_str(kw['body']))
43
+ self.redis_db_frame.rpush(self._queue_name, Serialization.to_json_str(kw['body']))
44
44
 
45
45
  def _shedual_task(self):
46
46
  lua = '''
@@ -4,6 +4,7 @@
4
4
  import json
5
5
  from funboost.constant import BrokerEnum
6
6
  from funboost.consumers.base_consumer import AbstractConsumer
7
+ from funboost.core.serialization import Serialization
7
8
  from funboost.utils.redis_manager import RedisMixin
8
9
 
9
10
 
@@ -24,6 +25,6 @@ class RedisConsumer(AbstractConsumer, RedisMixin):
24
25
  pass # redis没有确认消费的功能。
25
26
 
26
27
  def _requeue(self, kw):
27
- self.redis_db_frame.rpush(self._queue_name, json.dumps(kw['body']))
28
+ self.redis_db_frame.rpush(self._queue_name, Serialization.to_json_str(kw['body']))
28
29
 
29
30
 
@@ -11,6 +11,7 @@ import time
11
11
  from collections import OrderedDict
12
12
  import typing
13
13
 
14
+ from funboost.core.serialization import Serialization
14
15
  from funboost.utils import decorators
15
16
  from funboost.core.loggers import FunboostFileLoggerMixin
16
17
 
@@ -34,8 +35,7 @@ class RedisFilter(RedisMixin, FunboostFileLoggerMixin):
34
35
  @staticmethod
35
36
  def _get_ordered_str(value):
36
37
  """对json的键值对在redis中进行过滤,需要先把键值对排序,否则过滤会不准确如 {"a":1,"b":2} 和 {"b":2,"a":1}"""
37
- if isinstance(value, str):
38
- value = json.loads(value)
38
+ value = Serialization.to_dict(value)
39
39
  ordered_dict = OrderedDict()
40
40
  for k in sorted(value):
41
41
  ordered_dict[k] = value[k]
@@ -15,6 +15,7 @@ from pymongo import IndexModel, ReplaceOne
15
15
 
16
16
  from funboost.core.func_params_model import FunctionResultStatusPersistanceConfig
17
17
  from funboost.core.helper_funs import get_publish_time, delete_keys_and_return_new_dict
18
+ from funboost.core.serialization import Serialization
18
19
  from funboost.utils import time_util, decorators
19
20
  from funboost.utils.mongo_util import MongoMixin
20
21
  # from nb_log import LoggerMixin
@@ -46,7 +47,7 @@ class FunctionResultStatus():
46
47
  self.publish_time_str = time_util.DatetimeConverter(publish_time).datetime_str
47
48
  function_params = delete_keys_and_return_new_dict(msg_dict, )
48
49
  self.params = function_params
49
- self.params_str = json.dumps(function_params, ensure_ascii=False)
50
+ self.params_str = Serialization.to_json_str(function_params)
50
51
  self.result = None
51
52
  self.run_times = 0
52
53
  self.exception = None
@@ -78,7 +79,8 @@ class FunctionResultStatus():
78
79
  # item.pop('time_start')
79
80
  datetime_str = time_util.DatetimeConverter().datetime_str
80
81
  try:
81
- json.dumps(item['result']) # 不希望存不可json序列化的复杂类型。麻烦。存这种类型的结果是伪需求。
82
+ Serialization.to_json_str(item['result'])
83
+ # json.dumps(item['result']) # 不希望存不可json序列化的复杂类型。麻烦。存这种类型的结果是伪需求。
82
84
  except TypeError:
83
85
  item['result'] = str(item['result'])[:1000]
84
86
  item.update({'insert_time_str': datetime_str,
@@ -98,7 +100,7 @@ class FunctionResultStatus():
98
100
  return item
99
101
 
100
102
  def __str__(self):
101
- return f'''{self.__class__} {json.dumps(self.get_status_dict(), ensure_ascii=False)}'''
103
+ return f'''{self.__class__} {Serialization.to_json_str(self.get_status_dict())}'''
102
104
 
103
105
 
104
106
  class ResultPersistenceHelper(MongoMixin, FunboostFileLoggerMixin):
@@ -10,7 +10,7 @@ from funboost.concurrent_pool import CustomThreadPoolExecutor
10
10
  from funboost.concurrent_pool.flexible_thread_pool import FlexibleThreadPoolMinWorkers0
11
11
  from funboost.utils.redis_manager import RedisMixin
12
12
  from funboost.utils.redis_manager import AioRedisMixin
13
-
13
+ from funboost.core.serialization import Serialization
14
14
 
15
15
  class HasNotAsyncResult(Exception):
16
16
  pass
@@ -42,7 +42,7 @@ class AsyncResult(RedisMixin):
42
42
  self._has_pop = True
43
43
  if redis_value is not None:
44
44
  status_and_result_str = redis_value[1]
45
- self._status_and_result = json.loads(status_and_result_str)
45
+ self._status_and_result = Serialization.to_dict(status_and_result_str)
46
46
  self.redis_db_filter_and_rpc_result.lpush(self.task_id, status_and_result_str)
47
47
  self.redis_db_filter_and_rpc_result.expire(self.task_id, self._status_and_result['rpc_result_expire_seconds'])
48
48
  return self._status_and_result
@@ -147,7 +147,7 @@ if __name__ == '__main__':
147
147
  self._has_pop = True
148
148
  if redis_value is not None:
149
149
  status_and_result_str = redis_value[1]
150
- self._status_and_result = json.loads(status_and_result_str)
150
+ self._status_and_result = Serialization.to_dict(status_and_result_str)
151
151
  await self.aioredis_db_filter_and_rpc_result.lpush(self.task_id, status_and_result_str)
152
152
  await self.aioredis_db_filter_and_rpc_result.expire(self.task_id, self._status_and_result['rpc_result_expire_seconds'])
153
153
  return self._status_and_result
@@ -0,0 +1,16 @@
1
+ import typing
2
+
3
+ import orjson
4
+ class Serialization:
5
+ @staticmethod
6
+ def to_json_str(dic:typing.Union[dict,str]):
7
+ if isinstance(dic,str):
8
+ return dic
9
+ str1 =orjson.dumps(dic)
10
+ return str1.decode('utf8')
11
+
12
+ @staticmethod
13
+ def to_dict(strx:typing.Union[str,dict]):
14
+ if isinstance(strx,dict):
15
+ return strx
16
+ return orjson.loads(strx)
@@ -16,9 +16,9 @@ from funboost.publishers.local_python_queue_publisher import LocalPythonQueuePub
16
16
  from funboost.publishers.mongomq_publisher import MongoMqPublisher
17
17
 
18
18
  from funboost.publishers.persist_queue_publisher import PersistQueuePublisher
19
- from funboost.publishers.rabbitmq_amqpstorm_publisher import RabbitmqPublisherUsingAmqpStorm
19
+
20
20
  from funboost.publishers.rabbitmq_pika_publisher import RabbitmqPublisher
21
- from funboost.publishers.rabbitmq_rabbitpy_publisher import RabbitmqPublisherUsingRabbitpy
21
+
22
22
  from funboost.publishers.redis_publisher import RedisPublisher
23
23
  from funboost.publishers.rocketmq_publisher import RocketmqPublisher
24
24
  from funboost.publishers.redis_stream_publisher import RedisStreamPublisher
@@ -36,9 +36,8 @@ from funboost.consumers.nats_consumer import NatsConsumer
36
36
 
37
37
  from funboost.consumers.peewee_conusmer import PeeweeConsumer
38
38
  from funboost.consumers.persist_queue_consumer import PersistQueueConsumer
39
- from funboost.consumers.rabbitmq_amqpstorm_consumer import RabbitmqConsumerAmqpStorm
40
39
  from funboost.consumers.rabbitmq_pika_consumer import RabbitmqConsumer
41
- from funboost.consumers.rabbitmq_rabbitpy_consumer import RabbitmqConsumerRabbitpy
40
+
42
41
  from funboost.consumers.redis_brpoplpush_consumer import RedisBrpopLpushConsumer
43
42
  from funboost.consumers.redis_consumer import RedisConsumer
44
43
  from funboost.consumers.redis_consumer_ack_able import RedisConsumerAckAble
@@ -57,8 +56,8 @@ from funboost.consumers.base_consumer import AbstractConsumer
57
56
  from funboost.constant import BrokerEnum
58
57
 
59
58
  broker_kind__publsiher_consumer_type_map = {
60
- BrokerEnum.RABBITMQ_AMQPSTORM: (RabbitmqPublisherUsingAmqpStorm, RabbitmqConsumerAmqpStorm),
61
- BrokerEnum.RABBITMQ_RABBITPY: (RabbitmqPublisherUsingRabbitpy, RabbitmqConsumerRabbitpy),
59
+
60
+
62
61
  BrokerEnum.REDIS: (RedisPublisher, RedisConsumer),
63
62
  BrokerEnum.MEMORY_QUEUE: (LocalPythonQueuePublisher, LocalPythonQueueConsumer),
64
63
  BrokerEnum.RABBITMQ_PIKA: (RabbitmqPublisher, RabbitmqConsumer),
@@ -111,6 +110,15 @@ def regist_to_funboost(broker_kind: str):
111
110
  这样当用户需要使用某些三方包中间件作为消息队列时候,按照import报错信息,用户自己去pip安装好。或者 pip install funboost[all] 一次性安装所有中间件。
112
111
  建议按照 https://github.com/ydf0509/funboost/blob/master/setup.py 中的 extra_brokers 和 install_requires 里面的版本号来安装三方包版本.
113
112
  """
113
+ if broker_kind == BrokerEnum.RABBITMQ_AMQPSTORM:
114
+ from funboost.publishers.rabbitmq_amqpstorm_publisher import RabbitmqPublisherUsingAmqpStorm
115
+ from funboost.consumers.rabbitmq_amqpstorm_consumer import RabbitmqConsumerAmqpStorm
116
+ register_custom_broker(BrokerEnum.RABBITMQ_AMQPSTORM, RabbitmqPublisherUsingAmqpStorm, RabbitmqConsumerAmqpStorm)
117
+
118
+ if broker_kind == BrokerEnum.RABBITMQ_RABBITPY:
119
+ from funboost.publishers.rabbitmq_rabbitpy_publisher import RabbitmqPublisherUsingRabbitpy
120
+ from funboost.consumers.rabbitmq_rabbitpy_consumer import RabbitmqConsumerRabbitpy
121
+ register_custom_broker(BrokerEnum.RABBITMQ_RABBITPY, RabbitmqPublisherUsingRabbitpy, RabbitmqConsumerRabbitpy)
114
122
 
115
123
  if broker_kind == BrokerEnum.PULSAR:
116
124
  from funboost.consumers.pulsar_consumer import PulsarConsumer
@@ -16,7 +16,7 @@ import time
16
16
  import typing
17
17
  from functools import wraps
18
18
  from threading import Lock
19
- import amqpstorm
19
+
20
20
 
21
21
  import nb_log
22
22
  from funboost.constant import ConstStrForClassMethod, FunctionKind
@@ -24,11 +24,12 @@ from funboost.core.func_params_model import PublisherParams, PriorityConsumingCo
24
24
  from funboost.core.helper_funs import MsgGenerater
25
25
  from funboost.core.loggers import develop_logger
26
26
 
27
- from pikav1.exceptions import AMQPError as PikaAMQPError
27
+
28
28
 
29
29
  # from nb_log import LoggerLevelSetterMixin, LoggerMixin
30
30
  from funboost.core.loggers import LoggerLevelSetterMixin, FunboostFileLoggerMixin, get_logger
31
31
  from funboost.core.msg_result_getter import AsyncResult, AioAsyncResult
32
+ from funboost.core.serialization import Serialization
32
33
  from funboost.core.task_id_logger import TaskIdLogger
33
34
  from funboost.utils import decorators
34
35
  from funboost.funboost_config_deafult import BrokerConnConfig, FunboostCommonConfig
@@ -179,13 +180,13 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
179
180
 
180
181
  @staticmethod
181
182
  def _get_from_other_extra_params(k: str, msg):
182
- msg_dict = json.loads(msg) if isinstance(msg, str) else msg
183
+ # msg_dict = json.loads(msg) if isinstance(msg, str) else msg
184
+ msg_dict = Serialization.to_dict(msg)
183
185
  return msg_dict['extra'].get('other_extra_params', {}).get(k, None)
184
186
 
185
187
  def _convert_msg(self, msg: typing.Union[str, dict], task_id=None,
186
- priority_control_config: PriorityConsumingControlConfig = None) -> (typing.Dict, typing.Dict, typing.Dict):
187
- if isinstance(msg, (str, bytes)):
188
- msg = json.loads(msg)
188
+ priority_control_config: PriorityConsumingControlConfig = None) -> (typing.Dict, typing.Dict, typing.Dict,str):
189
+ msg = Serialization.to_dict(msg)
189
190
  msg_function_kw = copy.deepcopy(msg)
190
191
  raw_extra = {}
191
192
  if 'extra' in msg:
@@ -214,7 +215,7 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
214
215
  msg, msg_function_kw, extra_params, task_id = self._convert_msg(msg, task_id, priority_control_config)
215
216
  t_start = time.time()
216
217
  decorators.handle_exception(retry_times=10, is_throw_error=True, time_sleep=0.1)(
217
- self.concrete_realization_of_publish)(json.dumps(msg, ensure_ascii=False))
218
+ self.concrete_realization_of_publish)(Serialization.to_json_str(msg))
218
219
 
219
220
  self.logger.debug(f'向{self._queue_name} 队列,推送消息 耗时{round(time.time() - t_start, 4)}秒 {msg_function_kw}', extra={'task_id': task_id}) # 显示msg太长了。
220
221
  with self._lock_for_count:
@@ -228,10 +229,16 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
228
229
 
229
230
  def send_msg(self, msg: typing.Union[dict, str]):
230
231
  """直接发送任意消息内容到消息队列,不生成辅助参数,无视函数入参名字,不校验入参个数和键名"""
231
- if isinstance(msg, dict):
232
- msg = json.dumps(msg, ensure_ascii=False)
233
232
  decorators.handle_exception(retry_times=10, is_throw_error=True, time_sleep=0.1)(
234
- self.concrete_realization_of_publish)(msg)
233
+ self.concrete_realization_of_publish)(Serialization.to_json_str(msg))
234
+
235
+ @staticmethod
236
+ def __get_cls_file(cls: type):
237
+ if cls.__module__ == '__main__':
238
+ cls_file = Path(sys.argv[0]).resolve().as_posix()
239
+ else:
240
+ cls_file = Path(sys.modules[cls.__module__].__file__).resolve().as_posix()
241
+ return cls_file
235
242
 
236
243
  def push(self, *func_args, **func_kwargs):
237
244
  """
@@ -260,9 +267,10 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
260
267
  # )
261
268
  cls = func_args_list[0]
262
269
  # print(cls,cls.__name__, sys.modules[cls.__module__].__file__)
270
+
263
271
  func_args_list[0] = {ConstStrForClassMethod.FIRST_PARAM_NAME: self.publish_params_checker.all_arg_name[0],
264
272
  ConstStrForClassMethod.CLS_NAME: cls.__name__,
265
- ConstStrForClassMethod.CLS_FILE: Path(sys.modules[cls.__module__].__file__).resolve().as_posix(),
273
+ ConstStrForClassMethod.CLS_FILE: self.__get_cls_file(cls),
266
274
  }
267
275
  elif self.publisher_params.consuming_function_kind == FunctionKind.INSTANCE_METHOD:
268
276
  obj = func_args[0]
@@ -271,7 +279,7 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
271
279
  raise ValueError(f'消费函数 {self.publisher_params.consuming_function} 是实例方法,实例必须有 {ConstStrForClassMethod.OBJ_INIT_PARAMS} 属性')
272
280
  func_args_list[0] = {ConstStrForClassMethod.FIRST_PARAM_NAME: self.publish_params_checker.all_arg_name[0],
273
281
  ConstStrForClassMethod.CLS_NAME: cls.__name__,
274
- ConstStrForClassMethod.CLS_FILE: Path(sys.modules[cls.__module__].__file__).resolve().as_posix(),
282
+ ConstStrForClassMethod.CLS_FILE: self.__get_cls_file(cls),
275
283
  ConstStrForClassMethod.OBJ_INIT_PARAMS: getattr(obj, ConstStrForClassMethod.OBJ_INIT_PARAMS),
276
284
 
277
285
  }
@@ -330,11 +338,14 @@ def deco_mq_conn_error(f):
330
338
  # noinspection PyBroadException
331
339
  try:
332
340
  return f(self, *args, **kwargs)
333
-
334
- except (PikaAMQPError, amqpstorm.AMQPError,) as e: # except BaseException as e: # 现在装饰器用到了绝大多出地方,单个异常类型不行。ex
335
- self.logger.error(f'中间件链接出错 ,方法 {f.__name__} 出错 ,{e}')
336
- self.init_broker()
337
- return f(self, *args, **kwargs)
341
+ except Exception as e:
342
+ import amqpstorm
343
+ from pikav1.exceptions import AMQPError as PikaAMQPError
344
+ if isinstance(e,(PikaAMQPError, amqpstorm.AMQPError)):
345
+ # except (PikaAMQPError, amqpstorm.AMQPError,) as e: # except BaseException as e: # 现在装饰器用到了绝大多出地方,单个异常类型不行。ex
346
+ self.logger.error(f'中间件链接出错 ,方法 {f.__name__} 出错 ,{e}')
347
+ self.init_broker()
348
+ return f(self, *args, **kwargs)
338
349
  except BaseException as e:
339
350
  self.logger.critical(e, exc_info=True)
340
351
 
@@ -0,0 +1,57 @@
1
+ # -*- coding: utf-8 -*-
2
+ # @Author : ydf
3
+ # @Time : 2023/8/8 0008 12:12
4
+
5
+ import abc
6
+ import asyncio
7
+ import json
8
+ import time
9
+ import typing
10
+
11
+ from funboost import PriorityConsumingControlConfig
12
+ from funboost.core.serialization import Serialization
13
+ from funboost.publishers.base_publisher import AbstractPublisher
14
+ from funboost.assist.faststream_helper import app,get_broker
15
+ from faststream import FastStream,Context
16
+ from faststream.annotations import Logger
17
+
18
+ class FastStreamPublisher(AbstractPublisher, metaclass=abc.ABCMeta):
19
+ """
20
+ 空的发布者,空的实现,需要搭配 boost入参的 consumer_override_cls 和 publisher_override_cls使用,或者被继承。
21
+ """
22
+ def custom_init(self):
23
+ pass
24
+ # asyncio.get_event_loop().run_until_complete(broker.start())
25
+ self.broker = get_broker()
26
+ asyncio.get_event_loop().run_until_complete(self.broker.connect())
27
+
28
+ def publish(self, msg: typing.Union[str, dict], task_id=None,
29
+ priority_control_config: PriorityConsumingControlConfig = None) :
30
+ msg, msg_function_kw, extra_params, task_id = self._convert_msg(msg, task_id, priority_control_config)
31
+ t_start = time.time()
32
+ faststream_result = asyncio.get_event_loop().run_until_complete(self.broker.publish(Serialization.to_json_str(msg), self.queue_name))
33
+ self.logger.debug(f'向{self._queue_name} 队列,推送消息 耗时{round(time.time() - t_start, 4)}秒 {msg_function_kw}') # 显示msg太长了。
34
+ with self._lock_for_count:
35
+ self.count_per_minute += 1
36
+ self.publish_msg_num_total += 1
37
+ if time.time() - self._current_time > 10:
38
+ self.logger.info(
39
+ f'10秒内推送了 {self.count_per_minute} 条消息,累计推送了 {self.publish_msg_num_total} 条消息到 {self._queue_name} 队列中')
40
+ self._init_count()
41
+ # return AsyncResult(task_id)
42
+ return faststream_result #
43
+
44
+ def concrete_realization_of_publish(self, msg):
45
+ pass
46
+
47
+
48
+ def clear(self):
49
+ pass
50
+
51
+
52
+ def get_message_count(self):
53
+ return -1
54
+
55
+
56
+ def close(self):
57
+ pass
@@ -22,6 +22,7 @@ class LocalPythonQueuePublisher(AbstractPublisher):
22
22
 
23
23
  def concrete_realization_of_publish(self, msg):
24
24
  # noinspection PyTypeChecker
25
+ pass
25
26
  self.queue.put(msg)
26
27
 
27
28
  def clear(self):
@@ -45,20 +45,20 @@ def monkey_patch_json():
45
45
  json.dumps = _dumps
46
46
 
47
47
 
48
- class JsonUtils:
49
- @staticmethod
50
- def to_dict(obj:typing.Union[str,dict,list]):
51
- if isinstance(obj,str):
52
- return json.loads(obj)
53
- else:
54
- return obj
55
-
56
- @staticmethod
57
- def to_json_str(obj:typing.Union[str,dict,list]):
58
- if isinstance(obj,str):
59
- return obj
60
- else:
61
- return json.dumps(obj,ensure_ascii=False)
48
+ # class JsonUtils:
49
+ # @staticmethod
50
+ # def to_dict(obj:typing.Union[str,dict,list]):
51
+ # if isinstance(obj,str):
52
+ # return json.loads(obj)
53
+ # else:
54
+ # return obj
55
+ #
56
+ # @staticmethod
57
+ # def to_json_str(obj:typing.Union[str,dict,list]):
58
+ # if isinstance(obj,str):
59
+ # return obj
60
+ # else:
61
+ # return json.dumps(obj,ensure_ascii=False)
62
62
 
63
63
  if __name__ == '__main__':
64
64
  pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 45.3
3
+ Version: 45.4
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs