funboost 44.7__tar.gz → 44.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 (259) hide show
  1. {funboost-44.7/funboost.egg-info → funboost-44.9}/PKG-INFO +1 -1
  2. {funboost-44.7 → funboost-44.9}/funboost/__init__.py +1 -1
  3. {funboost-44.7 → funboost-44.9}/funboost/constant.py +14 -4
  4. {funboost-44.7 → funboost-44.9}/funboost/consumers/base_consumer.py +54 -20
  5. {funboost-44.7 → funboost-44.9}/funboost/core/booster.py +15 -0
  6. funboost-44.9/funboost/core/current_task.py +193 -0
  7. {funboost-44.7 → funboost-44.9}/funboost/core/func_params_model.py +23 -0
  8. {funboost-44.7 → funboost-44.9}/funboost/core/lazy_impoter.py +8 -2
  9. {funboost-44.7 → funboost-44.9}/funboost/publishers/base_publisher.py +21 -2
  10. {funboost-44.7 → funboost-44.9}/funboost/set_frame_config.py +2 -1
  11. funboost-44.9/funboost/utils/class_utils.py +101 -0
  12. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +3 -2
  13. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
  14. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
  15. funboost-44.9/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +244 -0
  16. funboost-44.7/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py → funboost-44.9/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +3 -3
  17. {funboost-44.7 → funboost-44.9/funboost.egg-info}/PKG-INFO +1 -1
  18. {funboost-44.7 → funboost-44.9}/funboost.egg-info/SOURCES.txt +1 -0
  19. funboost-44.7/funboost/core/current_task.py +0 -174
  20. funboost-44.7/funboost/utils/class_utils.py +0 -51
  21. {funboost-44.7 → funboost-44.9}/LICENSE +0 -0
  22. {funboost-44.7 → funboost-44.9}/MANIFEST.in +0 -0
  23. {funboost-44.7 → funboost-44.9}/README.md +0 -0
  24. {funboost-44.7 → funboost-44.9}/funboost/__init__old.py +0 -0
  25. {funboost-44.7 → funboost-44.9}/funboost/__main__.py +0 -0
  26. {funboost-44.7 → funboost-44.9}/funboost/assist/__init__.py +0 -0
  27. {funboost-44.7 → funboost-44.9}/funboost/assist/celery_helper.py +0 -0
  28. {funboost-44.7 → funboost-44.9}/funboost/assist/dramatiq_helper.py +0 -0
  29. {funboost-44.7 → funboost-44.9}/funboost/assist/huey_helper.py +0 -0
  30. {funboost-44.7 → funboost-44.9}/funboost/assist/rocketry_helper.py +0 -0
  31. {funboost-44.7 → funboost-44.9}/funboost/assist/rq_helper.py +0 -0
  32. {funboost-44.7 → funboost-44.9}/funboost/assist/rq_windows_worker.py +0 -0
  33. {funboost-44.7 → funboost-44.9}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
  34. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/__init__.py +0 -0
  35. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/async_helper.py +0 -0
  36. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/async_pool_executor.py +0 -0
  37. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/backup/__init__.py +0 -0
  38. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
  39. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
  40. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
  41. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/base_pool_type.py +0 -0
  42. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
  43. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
  44. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
  45. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
  46. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
  47. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
  48. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
  49. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
  50. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
  51. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
  52. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/pool_commons.py +0 -0
  53. {funboost-44.7 → funboost-44.9}/funboost/concurrent_pool/single_thread_executor.py +0 -0
  54. {funboost-44.7 → funboost-44.9}/funboost/consumers/__init__.py +0 -0
  55. {funboost-44.7 → funboost-44.9}/funboost/consumers/celery_consumer.py +0 -0
  56. {funboost-44.7 → funboost-44.9}/funboost/consumers/confirm_mixin.py +0 -0
  57. {funboost-44.7 → funboost-44.9}/funboost/consumers/dramatiq_consumer.py +0 -0
  58. {funboost-44.7 → funboost-44.9}/funboost/consumers/empty_consumer.py +0 -0
  59. {funboost-44.7 → funboost-44.9}/funboost/consumers/http_consumer.py +0 -0
  60. {funboost-44.7 → funboost-44.9}/funboost/consumers/http_consumer000.py +0 -0
  61. {funboost-44.7 → funboost-44.9}/funboost/consumers/httpsqs_consumer.py +0 -0
  62. {funboost-44.7 → funboost-44.9}/funboost/consumers/huey_consumer.py +0 -0
  63. {funboost-44.7 → funboost-44.9}/funboost/consumers/kafka_consumer.py +0 -0
  64. {funboost-44.7 → funboost-44.9}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
  65. {funboost-44.7 → funboost-44.9}/funboost/consumers/kombu_consumer.py +0 -0
  66. {funboost-44.7 → funboost-44.9}/funboost/consumers/local_python_queue_consumer.py +0 -0
  67. {funboost-44.7 → funboost-44.9}/funboost/consumers/memory_deque_consumer.py +0 -0
  68. {funboost-44.7 → funboost-44.9}/funboost/consumers/mongomq_consumer.py +0 -0
  69. {funboost-44.7 → funboost-44.9}/funboost/consumers/mqtt_consumer.py +0 -0
  70. {funboost-44.7 → funboost-44.9}/funboost/consumers/nameko_consumer.py +0 -0
  71. {funboost-44.7 → funboost-44.9}/funboost/consumers/nats_consumer.py +0 -0
  72. {funboost-44.7 → funboost-44.9}/funboost/consumers/nsq_consumer.py +0 -0
  73. {funboost-44.7 → funboost-44.9}/funboost/consumers/peewee_conusmer.py +0 -0
  74. {funboost-44.7 → funboost-44.9}/funboost/consumers/persist_queue_consumer.py +0 -0
  75. {funboost-44.7 → funboost-44.9}/funboost/consumers/pulsar_consumer.py +0 -0
  76. {funboost-44.7 → funboost-44.9}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
  77. {funboost-44.7 → funboost-44.9}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
  78. {funboost-44.7 → funboost-44.9}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
  79. {funboost-44.7 → funboost-44.9}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
  80. {funboost-44.7 → funboost-44.9}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
  81. {funboost-44.7 → funboost-44.9}/funboost/consumers/redis_consumer.py +0 -0
  82. {funboost-44.7 → funboost-44.9}/funboost/consumers/redis_consumer_ack_able.py +0 -0
  83. {funboost-44.7 → funboost-44.9}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
  84. {funboost-44.7 → funboost-44.9}/funboost/consumers/redis_consumer_priority.py +0 -0
  85. {funboost-44.7 → funboost-44.9}/funboost/consumers/redis_consumer_simple.py +0 -0
  86. {funboost-44.7 → funboost-44.9}/funboost/consumers/redis_filter.py +0 -0
  87. {funboost-44.7 → funboost-44.9}/funboost/consumers/redis_pubsub_consumer.py +0 -0
  88. {funboost-44.7 → funboost-44.9}/funboost/consumers/redis_stream_consumer.py +0 -0
  89. {funboost-44.7 → funboost-44.9}/funboost/consumers/rocketmq_consumer.py +0 -0
  90. {funboost-44.7 → funboost-44.9}/funboost/consumers/rq_consumer.py +0 -0
  91. {funboost-44.7 → funboost-44.9}/funboost/consumers/sqlachemy_consumer.py +0 -0
  92. {funboost-44.7 → funboost-44.9}/funboost/consumers/tcp_consumer.py +0 -0
  93. {funboost-44.7 → funboost-44.9}/funboost/consumers/txt_file_consumer.py +0 -0
  94. {funboost-44.7 → funboost-44.9}/funboost/consumers/udp_consumer.py +0 -0
  95. {funboost-44.7 → funboost-44.9}/funboost/consumers/zeromq_consumer.py +0 -0
  96. {funboost-44.7 → funboost-44.9}/funboost/contrib/__init__.py +0 -0
  97. {funboost-44.7 → funboost-44.9}/funboost/contrib/api_publish_msg.py +0 -0
  98. {funboost-44.7 → funboost-44.9}/funboost/contrib/django_db_deco.py +0 -0
  99. {funboost-44.7 → funboost-44.9}/funboost/contrib/queue2queue.py +0 -0
  100. {funboost-44.7 → funboost-44.9}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
  101. {funboost-44.7 → funboost-44.9}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
  102. {funboost-44.7 → funboost-44.9}/funboost/core/__init__.py +0 -0
  103. {funboost-44.7 → funboost-44.9}/funboost/core/active_cousumer_info_getter.py +0 -0
  104. {funboost-44.7 → funboost-44.9}/funboost/core/cli/__init__.py +0 -0
  105. {funboost-44.7 → funboost-44.9}/funboost/core/cli/discovery_boosters.py +0 -0
  106. {funboost-44.7 → funboost-44.9}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
  107. {funboost-44.7 → funboost-44.9}/funboost/core/cli/funboost_fire.py +0 -0
  108. {funboost-44.7 → funboost-44.9}/funboost/core/exceptions.py +0 -0
  109. {funboost-44.7 → funboost-44.9}/funboost/core/fabric_deploy_helper.py +0 -0
  110. {funboost-44.7 → funboost-44.9}/funboost/core/funboost_config_getter.py +0 -0
  111. {funboost-44.7 → funboost-44.9}/funboost/core/funboost_current_task_context_thread.py +0 -0
  112. {funboost-44.7 → funboost-44.9}/funboost/core/funboost_time.py +0 -0
  113. {funboost-44.7 → funboost-44.9}/funboost/core/function_result_status_config.py +0 -0
  114. {funboost-44.7 → funboost-44.9}/funboost/core/function_result_status_saver.py +0 -0
  115. {funboost-44.7 → funboost-44.9}/funboost/core/helper_funs.py +0 -0
  116. {funboost-44.7 → funboost-44.9}/funboost/core/kill_remote_task.py +0 -0
  117. {funboost-44.7 → funboost-44.9}/funboost/core/loggers.py +0 -0
  118. {funboost-44.7 → funboost-44.9}/funboost/core/msg_result_getter.py +0 -0
  119. {funboost-44.7 → funboost-44.9}/funboost/core/muliti_process_enhance.py +0 -0
  120. {funboost-44.7 → funboost-44.9}/funboost/core/task_id_logger.py +0 -0
  121. {funboost-44.7 → funboost-44.9}/funboost/factories/__init__.py +0 -0
  122. {funboost-44.7 → funboost-44.9}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
  123. {funboost-44.7 → funboost-44.9}/funboost/factories/consumer_factory.py +0 -0
  124. {funboost-44.7 → funboost-44.9}/funboost/factories/publisher_factotry.py +0 -0
  125. {funboost-44.7 → funboost-44.9}/funboost/funboost_config_deafult.py +0 -0
  126. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
  127. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/app.py +0 -0
  128. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/functions.py +0 -0
  129. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/assets/css/custom.css +0 -0
  130. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
  131. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
  132. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/assets/js/custom.js +0 -0
  133. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
  134. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/css/style.css +0 -0
  135. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/images/bg.jpg +0 -0
  136. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/images/password.png +0 -0
  137. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/images/tick.png +0 -0
  138. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/images/user.png +0 -0
  139. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
  140. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/templates/index.html +0 -0
  141. {funboost-44.7 → funboost-44.9}/funboost/function_result_web/templates/login.html +0 -0
  142. {funboost-44.7 → funboost-44.9}/funboost/publishers/__init__.py +0 -0
  143. {funboost-44.7 → funboost-44.9}/funboost/publishers/celery_publisher.py +0 -0
  144. {funboost-44.7 → funboost-44.9}/funboost/publishers/celery_publisher000.py +0 -0
  145. {funboost-44.7 → funboost-44.9}/funboost/publishers/confluent_kafka_publisher.py +0 -0
  146. {funboost-44.7 → funboost-44.9}/funboost/publishers/dramatiq_publisher.py +0 -0
  147. {funboost-44.7 → funboost-44.9}/funboost/publishers/empty_publisher.py +0 -0
  148. {funboost-44.7 → funboost-44.9}/funboost/publishers/http_publisher.py +0 -0
  149. {funboost-44.7 → funboost-44.9}/funboost/publishers/httpsqs_publisher.py +0 -0
  150. {funboost-44.7 → funboost-44.9}/funboost/publishers/huey_publisher.py +0 -0
  151. {funboost-44.7 → funboost-44.9}/funboost/publishers/kafka_publisher.py +0 -0
  152. {funboost-44.7 → funboost-44.9}/funboost/publishers/kombu_publisher.py +0 -0
  153. {funboost-44.7 → funboost-44.9}/funboost/publishers/local_python_queue_publisher.py +0 -0
  154. {funboost-44.7 → funboost-44.9}/funboost/publishers/meomory_deque_publisher.py +0 -0
  155. {funboost-44.7 → funboost-44.9}/funboost/publishers/mongomq_publisher.py +0 -0
  156. {funboost-44.7 → funboost-44.9}/funboost/publishers/mqtt_publisher.py +0 -0
  157. {funboost-44.7 → funboost-44.9}/funboost/publishers/nameko_publisher.py +0 -0
  158. {funboost-44.7 → funboost-44.9}/funboost/publishers/nats_publisher.py +0 -0
  159. {funboost-44.7 → funboost-44.9}/funboost/publishers/nsq_publisher.py +0 -0
  160. {funboost-44.7 → funboost-44.9}/funboost/publishers/peewee_publisher.py +0 -0
  161. {funboost-44.7 → funboost-44.9}/funboost/publishers/persist_queue_publisher.py +0 -0
  162. {funboost-44.7 → funboost-44.9}/funboost/publishers/pulsar_publisher.py +0 -0
  163. {funboost-44.7 → funboost-44.9}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
  164. {funboost-44.7 → funboost-44.9}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
  165. {funboost-44.7 → funboost-44.9}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
  166. {funboost-44.7 → funboost-44.9}/funboost/publishers/redis_publisher.py +0 -0
  167. {funboost-44.7 → funboost-44.9}/funboost/publishers/redis_publisher_lpush.py +0 -0
  168. {funboost-44.7 → funboost-44.9}/funboost/publishers/redis_publisher_priority.py +0 -0
  169. {funboost-44.7 → funboost-44.9}/funboost/publishers/redis_publisher_simple.py +0 -0
  170. {funboost-44.7 → funboost-44.9}/funboost/publishers/redis_pubsub_publisher.py +0 -0
  171. {funboost-44.7 → funboost-44.9}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
  172. {funboost-44.7 → funboost-44.9}/funboost/publishers/redis_stream_publisher.py +0 -0
  173. {funboost-44.7 → funboost-44.9}/funboost/publishers/rocketmq_publisher.py +0 -0
  174. {funboost-44.7 → funboost-44.9}/funboost/publishers/rq_publisher.py +0 -0
  175. {funboost-44.7 → funboost-44.9}/funboost/publishers/sqla_queue_publisher.py +0 -0
  176. {funboost-44.7 → funboost-44.9}/funboost/publishers/tcp_publisher.py +0 -0
  177. {funboost-44.7 → funboost-44.9}/funboost/publishers/txt_file_publisher.py +0 -0
  178. {funboost-44.7 → funboost-44.9}/funboost/publishers/udp_publisher.py +0 -0
  179. {funboost-44.7 → funboost-44.9}/funboost/publishers/zeromq_publisher.py +0 -0
  180. {funboost-44.7 → funboost-44.9}/funboost/queues/__init__.py +0 -0
  181. {funboost-44.7 → funboost-44.9}/funboost/queues/peewee_queue.py +0 -0
  182. {funboost-44.7 → funboost-44.9}/funboost/queues/sqla_queue.py +0 -0
  183. {funboost-44.7 → funboost-44.9}/funboost/timing_job/__init__.py +0 -0
  184. {funboost-44.7 → funboost-44.9}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
  185. {funboost-44.7 → funboost-44.9}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
  186. {funboost-44.7 → funboost-44.9}/funboost/utils/__init__.py +0 -0
  187. {funboost-44.7 → funboost-44.9}/funboost/utils/apscheduler_monkey.py +0 -0
  188. {funboost-44.7 → funboost-44.9}/funboost/utils/block_exit.py +0 -0
  189. {funboost-44.7 → funboost-44.9}/funboost/utils/bulk_operation.py +0 -0
  190. {funboost-44.7 → funboost-44.9}/funboost/utils/ctrl_c_end.py +0 -0
  191. {funboost-44.7 → funboost-44.9}/funboost/utils/custom_pysnooper.py +0 -0
  192. {funboost-44.7 → funboost-44.9}/funboost/utils/decorators.py +0 -0
  193. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages/__init__.py +0 -0
  194. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
  195. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
  196. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
  197. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
  198. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
  199. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
  200. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
  201. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  202. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  203. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
  204. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
  205. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
  206. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
  207. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  208. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
  209. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
  210. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
  211. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
  212. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
  213. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
  214. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
  215. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
  216. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
  217. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
  218. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
  219. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
  220. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
  221. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
  222. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
  223. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
  224. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
  225. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
  226. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
  227. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
  228. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
  229. {funboost-44.7 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
  230. {funboost-44.7 → funboost-44.9}/funboost/utils/develop_log.py +0 -0
  231. {funboost-44.7 → funboost-44.9}/funboost/utils/expire_lock.py +0 -0
  232. {funboost-44.7 → funboost-44.9}/funboost/utils/json_helper.py +0 -0
  233. {funboost-44.7 → funboost-44.9}/funboost/utils/mongo_util.py +0 -0
  234. {funboost-44.7 → funboost-44.9}/funboost/utils/monkey_color_log.py +0 -0
  235. {funboost-44.7 → funboost-44.9}/funboost/utils/monkey_patches.py +0 -0
  236. {funboost-44.7 → funboost-44.9}/funboost/utils/mqtt_util.py +0 -0
  237. {funboost-44.7 → funboost-44.9}/funboost/utils/paramiko_util.py +0 -0
  238. {funboost-44.7 → funboost-44.9}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
  239. {funboost-44.7 → funboost-44.9}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
  240. {funboost-44.7 → funboost-44.9}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
  241. {funboost-44.7 → funboost-44.9}/funboost/utils/pysnooper_ydf/utils.py +0 -0
  242. {funboost-44.7 → funboost-44.9}/funboost/utils/pysnooper_ydf/variables.py +0 -0
  243. {funboost-44.7 → funboost-44.9}/funboost/utils/rabbitmq_factory.py +0 -0
  244. {funboost-44.7 → funboost-44.9}/funboost/utils/redis_manager.py +0 -0
  245. {funboost-44.7 → funboost-44.9}/funboost/utils/redis_manager_old.py +0 -0
  246. {funboost-44.7 → funboost-44.9}/funboost/utils/resource_monitoring.py +0 -0
  247. {funboost-44.7 → funboost-44.9}/funboost/utils/restart_python.py +0 -0
  248. {funboost-44.7 → funboost-44.9}/funboost/utils/simple_data_class.py +0 -0
  249. {funboost-44.7 → funboost-44.9}/funboost/utils/str_utils.py +0 -0
  250. {funboost-44.7 → funboost-44.9}/funboost/utils/time_util.py +0 -0
  251. {funboost-44.7 → funboost-44.9}/funboost/utils/times/__init__.py +0 -0
  252. {funboost-44.7 → funboost-44.9}/funboost/utils/times/version.py +0 -0
  253. {funboost-44.7 → funboost-44.9}/funboost/utils/un_strict_json_dumps.py +0 -0
  254. {funboost-44.7 → funboost-44.9}/funboost.egg-info/dependency_links.txt +0 -0
  255. {funboost-44.7 → funboost-44.9}/funboost.egg-info/entry_points.txt +0 -0
  256. {funboost-44.7 → funboost-44.9}/funboost.egg-info/requires.txt +0 -0
  257. {funboost-44.7 → funboost-44.9}/funboost.egg-info/top_level.txt +0 -0
  258. {funboost-44.7 → funboost-44.9}/setup.cfg +0 -0
  259. {funboost-44.7 → funboost-44.9}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 44.7
3
+ Version: 44.9
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__ = "44.7"
16
+ __version__ = "44.9"
17
17
 
18
18
  from funboost.set_frame_config import show_frame_config
19
19
 
@@ -1,6 +1,6 @@
1
1
  # coding= utf-8
2
2
  class BrokerEnum:
3
- EMPTY = 'empty' # 空的实现,需要搭配 boost入参的 consumer_override_cls 和 publisher_override_cls使用,或者被继承。
3
+ EMPTY = 'empty' # 空的实现,需要搭配 boost入参的 consumer_override_cls 和 publisher_override_cls使用,或者被继承。
4
4
 
5
5
  RABBITMQ_AMQPSTORM = 'RABBITMQ_AMQPSTORM' # 使用 amqpstorm 包操作rabbitmq 作为 分布式消息队列,支持消费确认.强烈推荐这个作为funboost中间件。
6
6
  RABBITMQ = RABBITMQ_AMQPSTORM
@@ -41,8 +41,6 @@ class BrokerEnum:
41
41
 
42
42
  ZEROMQ = 'ZEROMQ' # 基于zeromq作为分布式消息队列,不需要安装中间件,可以支持跨机器但不支持持久化。
43
43
 
44
-
45
-
46
44
  """
47
45
  操作 kombu 包,这个包也是celery的中间件依赖包,这个包可以操作10种中间件(例如rabbitmq redis),但没包括分布式函数调度框架的kafka nsq zeromq 等。
48
46
  同时 kombu 包的性能非常差,可以用原生redis的lpush和kombu的publish测试发布,使用brpop 和 kombu 的 drain_events测试消费,对比差距相差了5到10倍。
@@ -71,7 +69,6 @@ class BrokerEnum:
71
69
 
72
70
  PEEWEE = 'PEEWEE' # peewee包操作mysql,使用表模拟消息队列
73
71
 
74
-
75
72
  CELERY = 'CELERY' # funboost支持celery框架来发布和消费任务,由celery框架来调度执行任务,但是写法简单远远暴击用户亲自使用celery的麻烦程度,
76
73
  # 用户永无无需关心和操作Celery对象实例,无需关心celery的task_routes和include配置,funboost来自动化设置这些celery配置。
77
74
 
@@ -92,4 +89,17 @@ class ConcurrentModeEnum:
92
89
  SINGLE_THREAD = 'single_thread' # 如果你不想并发,不想预先从消息队列中间件拉取消息到python程序的内存queue队列缓冲中,那么就适合使用此并发模式。
93
90
  SOLO = SINGLE_THREAD
94
91
 
92
+
95
93
  # is_fsdf_remote_run = 0
94
+
95
+ class FunctionKind:
96
+ CLASS_METHOD = 'CLASS_METHOD'
97
+ INSTANCE_METHOD = 'INSTANCE_METHOD'
98
+ STATIC_METHOD = 'STATIC_METHOD'
99
+ COMMON_FUNCTION = 'COMMON_FUNCTION'
100
+
101
+
102
+ class ConstStrForClassMethod:
103
+ FIRST_PARAM_NAME = 'first_param_name'
104
+ CLS_NAME = 'cls_name'
105
+ OBJ_INIT_PARAMS = 'obj_init_params'
@@ -8,6 +8,7 @@
8
8
  框架做主要的功能都是在这个文件里面实现的.
9
9
  """
10
10
  import functools
11
+ import sys
11
12
  import typing
12
13
  import abc
13
14
  import copy
@@ -30,13 +31,14 @@ from threading import Lock
30
31
  import asyncio
31
32
 
32
33
  import nb_log
33
- from funboost.core.current_task import funboost_current_task
34
+ from funboost.core.current_task import funboost_current_task, FctContext
34
35
  from funboost.core.loggers import develop_logger
35
36
 
36
37
  from funboost.core.func_params_model import BoosterParams, PublisherParams, BaseJsonAbleModel
37
38
  from funboost.core.task_id_logger import TaskIdLogger
39
+ from funboost.constant import FunctionKind
38
40
  from funboost.utils.json_helper import JsonUtils
39
- from nb_log import (get_logger, LoggerLevelSetterMixin, LogManager, is_main_process,
41
+ from nb_log import (get_logger, LoggerLevelSetterMixin, LogManager, is_main_process,
40
42
  nb_log_config_default)
41
43
  from funboost.core.loggers import FunboostFileLoggerMixin, logger_prompt
42
44
 
@@ -66,7 +68,7 @@ from funboost.consumers.redis_filter import RedisFilter, RedisImpermanencyFilter
66
68
  from funboost.factories.publisher_factotry import get_publisher
67
69
 
68
70
  from funboost.utils import decorators, time_util, redis_manager
69
- from funboost.constant import ConcurrentModeEnum, BrokerEnum
71
+ from funboost.constant import ConcurrentModeEnum, BrokerEnum, ConstStrForClassMethod
70
72
  from funboost.core import kill_remote_task
71
73
  from funboost.core.exceptions import ExceptionForRequeue, ExceptionForPushToDlxqueue
72
74
 
@@ -562,9 +564,35 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
562
564
  """
563
565
  self._do_not_delete_extra_from_msg = True
564
566
 
565
- def user_custom_record_process_info_func(self,current_function_result_status:FunctionResultStatus): # 这个可以继承
567
+ def user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus): # 这个可以继承
566
568
  pass
567
569
 
570
+ async def aio_user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus): # 这个可以继承
571
+ pass
572
+
573
+ def _convert_real_function_only_params_by_conusuming_function_kind(self, function_only_params: dict):
574
+ """对于实例方法和classmethod 方法, 从消息队列的消息恢复第一个入参, self 和 cls"""
575
+ if self.consumer_params.consuming_function_kind in [FunctionKind.CLASS_METHOD, FunctionKind.INSTANCE_METHOD]:
576
+ real_function_only_params = copy.copy(function_only_params)
577
+ method_first_param_name = None
578
+ method_first_param_value = None
579
+ for k, v in function_only_params.items():
580
+ if isinstance(v, dict) and ConstStrForClassMethod.FIRST_PARAM_NAME in v:
581
+ method_first_param_name = k
582
+ method_first_param_value = v
583
+ break
584
+ method_cls = getattr(sys.modules[self.consumer_params.consuming_function_class_module],
585
+ self.consumer_params.consuming_function_class_name)
586
+ if self.publisher_params.consuming_function_kind == FunctionKind.CLASS_METHOD:
587
+ real_function_only_params[method_first_param_name] = method_cls
588
+ elif self.publisher_params.consuming_function_kind == FunctionKind.INSTANCE_METHOD:
589
+ obj = method_cls(**method_first_param_value[ConstStrForClassMethod.OBJ_INIT_PARAMS])
590
+ real_function_only_params[method_first_param_name] = obj
591
+ # print(real_function_only_params)
592
+ return real_function_only_params
593
+ else:
594
+ return function_only_params
595
+
568
596
  # noinspection PyProtectedMember
569
597
  def _run(self, kw: dict, ):
570
598
  # print(kw)
@@ -624,9 +652,9 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
624
652
  msg = f'{self._unit_time_for_count} 秒内执行了 {self._execute_task_times_every_unit_time} 次函数 [ {self.consuming_function.__name__} ] ,' \
625
653
  f'函数平均运行耗时 {avarage_function_spend_time} 秒。 '
626
654
  self.logger.info(msg)
627
- if time.time() - self._last_show_remaining_execution_time > self._show_remaining_execution_time_interval:
655
+ if time.time() - self._last_show_remaining_execution_time > self._show_remaining_execution_time_interval:
628
656
  self._msg_num_in_broker = self.publisher_of_same_queue.get_message_count()
629
- if self._msg_num_in_broker != -1 : # 有的中间件无法统计或没实现统计队列剩余数量的,统一返回的是-1,不显示这句话。
657
+ if self._msg_num_in_broker != -1: # 有的中间件无法统计或没实现统计队列剩余数量的,统一返回的是-1,不显示这句话。
630
658
  # msg += f''' ,预计还需要 {time_util.seconds_to_hour_minute_second(self._msg_num_in_broker * avarage_function_spend_time / active_consumer_num)} 时间 才能执行完成 {self._msg_num_in_broker}个剩余的任务'''
631
659
  need_time = time_util.seconds_to_hour_minute_second(self._msg_num_in_broker / (self._execute_task_times_every_unit_time / self._unit_time_for_count) /
632
660
  self._distributed_consumer_statistics.active_consumer_num)
@@ -636,7 +664,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
636
664
  self._current_time_for_execute_task_times_every_unit_time = time.time()
637
665
  self._consuming_function_cost_time_total_every_unit_time = 0
638
666
  self._execute_task_times_every_unit_time = 0
639
- self.user_custom_record_process_info_func(current_function_result_status) # 两种方式都可以自定义,记录结果.
667
+ self.user_custom_record_process_info_func(current_function_result_status) # 两种方式都可以自定义,记录结果,建议继承方式,不使用boost中指定 user_custom_record_process_info_func
640
668
  if self.consumer_params.user_custom_record_process_info_func:
641
669
  self.consumer_params.user_custom_record_process_info_func(current_function_result_status)
642
670
  except BaseException as e:
@@ -653,17 +681,19 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
653
681
  t_start = time.time()
654
682
  # function_result_status.run_times = current_retry_times + 1
655
683
  fct = funboost_current_task()
656
- fct.function_params = function_only_params
657
- fct.full_msg = kw['body']
658
- fct.function_result_status = function_result_status
659
- fct.logger = self.logger
684
+ fct_context = FctContext(function_params=function_only_params,
685
+ full_msg=kw['body'],
686
+ function_result_status=function_result_status,
687
+ logger=self.logger, )
688
+
660
689
  try:
661
690
  function_run = self.consuming_function
662
691
  if self._consuming_function_is_asyncio:
663
- fct._fct_local_data._asyncio_use_thread_concurrent_mode = True
692
+ fct_context.asyncio_use_thread_concurrent_mode = True
664
693
  function_run = sync_or_async_fun_deco(function_run)
665
694
  else:
666
- fct._fct_local_data._asynco_use_thread_concurrent_mode = False
695
+ fct_context.asynco_use_thread_concurrent_mode = False
696
+ fct.set_fct_context(fct_context)
667
697
  function_timeout = self._get_priority_conf(kw, 'function_timeout')
668
698
  function_run = function_run if self.consumer_params.consumin_function_decorator is None else self.consumer_params.consumin_function_decorator(function_run)
669
699
  function_run = function_run if not function_timeout else self._concurrent_mode_dispatcher.timeout_deco(
@@ -675,7 +705,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
675
705
  self.logger.warning(f'取消运行 {task_id} {function_only_params}')
676
706
  return function_result_status
677
707
  function_run = kill_remote_task.kill_fun_deco(task_id)(function_run) # 用杀死装饰器包装起来在另一个线程运行函数,以便等待远程杀死。
678
- function_result_status.result = function_run(**function_only_params)
708
+ function_result_status.result = function_run(**self._convert_real_function_only_params_by_conusuming_function_kind(function_only_params))
679
709
  # if asyncio.iscoroutine(function_result_status.result):
680
710
  # log_msg = f'''异步的协程消费函数必须使用 async 并发模式并发,请设置消费函数 {self.consuming_function.__name__} 的concurrent_mode 为 ConcurrentModeEnum.ASYNC 或 4'''
681
711
  # # self.logger.critical(msg=f'{log_msg} \n')
@@ -804,8 +834,11 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
804
834
  self._consuming_function_cost_time_total_every_unit_time = 0
805
835
  self._execute_task_times_every_unit_time = 0
806
836
 
837
+ self.user_custom_record_process_info_func(current_function_result_status) # 两种方式都可以自定义,记录结果.建议使用文档4.21.b的方式继承来重写
838
+ await self.aio_user_custom_record_process_info_func(current_function_result_status)
807
839
  if self.consumer_params.user_custom_record_process_info_func:
808
- await self.consumer_params.user_custom_record_process_info_func(current_function_result_status)
840
+ self.consumer_params.user_custom_record_process_info_func(current_function_result_status)
841
+
809
842
  except BaseException as e:
810
843
  log_msg = f' error 严重错误 {type(e)} {e} '
811
844
  # self.logger.critical(msg=f'{log_msg} \n', exc_info=True)
@@ -822,12 +855,13 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
822
855
  # noinspection PyBroadException
823
856
  t_start = time.time()
824
857
  fct = funboost_current_task()
825
- fct.function_params = function_only_params
826
- fct.full_msg = kw['body']
827
- fct.function_result_status = function_result_status
828
- fct.logger = self.logger
858
+ fct_context = FctContext(function_params=function_only_params,
859
+ full_msg=kw['body'],
860
+ function_result_status=function_result_status,
861
+ logger=self.logger, )
862
+ fct.set_fct_context(fct_context)
829
863
  try:
830
- corotinue_obj = self.consuming_function(**function_only_params)
864
+ corotinue_obj = self.consuming_function(**self._convert_real_function_only_params_by_conusuming_function_kind(function_only_params))
831
865
  if not asyncio.iscoroutine(corotinue_obj):
832
866
  log_msg = f'''当前设置的并发模式为 async 并发模式,但消费函数不是异步协程函数,请不要把消费函数 {self.consuming_function.__name__} 的 concurrent_mode 设置错误'''
833
867
  # self.logger.critical(msg=f'{log_msg} \n')
@@ -1,11 +1,16 @@
1
1
  from __future__ import annotations
2
2
  import copy
3
+ import inspect
3
4
  import os
5
+ import sys
4
6
  import types
5
7
  import typing
6
8
 
7
9
  from funboost.concurrent_pool import FlexibleThreadPool
8
10
  from funboost.concurrent_pool.async_helper import simple_run_in_executor
11
+ from funboost.constant import FunctionKind
12
+ from funboost.utils.class_utils import ClsHelper
13
+
9
14
  from funboost.utils.ctrl_c_end import ctrl_c_recv
10
15
  from funboost.core.loggers import flogger, develop_logger, logger_prompt
11
16
 
@@ -85,6 +90,16 @@ class Booster:
85
90
  if len(kwargs) == 0 and len(args) == 1 and isinstance(args[0], typing.Callable):
86
91
  consuming_function = args[0]
87
92
  self.boost_params.consuming_function = consuming_function
93
+ # print(consuming_function)
94
+ # print(ClsHelper.get_method_kind(consuming_function))
95
+ # print(inspect.getsourcelines(consuming_function))
96
+ if self.boost_params.consuming_function_kind is None:
97
+ self.boost_params.consuming_function_kind = ClsHelper.get_method_kind(consuming_function)
98
+ if self.boost_params.consuming_function_kind in [FunctionKind.CLASS_METHOD,FunctionKind.INSTANCE_METHOD]:
99
+ if self.boost_params.consuming_function_class_module is None:
100
+ self.boost_params.consuming_function_class_module = consuming_function.__module__
101
+ if self.boost_params.consuming_function_class_name is None:
102
+ self.boost_params.consuming_function_class_name = consuming_function.__qualname__.split('.')[0]
88
103
  logger_prompt.debug(f''' {self.boost_params.queue_name} booster 配置是 {self.boost_params.json_str_value()}''')
89
104
  self.consuming_function = consuming_function
90
105
  self.is_decorated_as_consume_function = True
@@ -0,0 +1,193 @@
1
+ import abc
2
+ import contextvars
3
+ from dataclasses import dataclass
4
+ import logging
5
+ import threading
6
+ import asyncio
7
+
8
+ from funboost.core.function_result_status_saver import FunctionResultStatus
9
+
10
+ """ 用法例子
11
+ '''
12
+ fct = funboost_current_task()
13
+ print(fct.function_result_status.get_status_dict())
14
+ print(fct.function_result_status.task_id)
15
+ print(fct.function_result_status.run_times)
16
+ print(fct.full_msg)
17
+ '''
18
+ import random
19
+ import time
20
+
21
+ from funboost import boost, FunctionResultStatusPersistanceConfig,BoosterParams
22
+ from funboost.core.current_task import funboost_current_task
23
+
24
+ @boost(BoosterParams(queue_name='queue_test_f01', qps=2,concurrent_num=5,
25
+ function_result_status_persistance_conf=FunctionResultStatusPersistanceConfig(
26
+ is_save_status=True, is_save_result=True, expire_seconds=7 * 24 * 3600)))
27
+ def f(a, b):
28
+ fct = funboost_current_task()
29
+ print(fct.function_result_status.get_status_dict())
30
+ print(fct.function_result_status.task_id)
31
+ print(fct.function_result_status.run_times)
32
+ print(fct.full_msg)
33
+
34
+ time.sleep(20)
35
+ if random.random() > 0.5:
36
+ raise Exception(f'{a} {b} 模拟出错啦')
37
+ print(a+b)
38
+
39
+ return a + b
40
+
41
+
42
+ if __name__ == '__main__':
43
+ # f(5, 6) # 可以直接调用
44
+
45
+ for i in range(0, 200):
46
+ f.push(i, b=i * 2)
47
+
48
+ f.consume()
49
+
50
+ """
51
+
52
+
53
+ @dataclass
54
+ class FctContext:
55
+ """
56
+ fct 是 funboost current task 的简写
57
+ """
58
+
59
+ function_params: dict
60
+ full_msg: dict
61
+ function_result_status: FunctionResultStatus
62
+ logger: logging.Logger
63
+ asyncio_use_thread_concurrent_mode: bool = False
64
+
65
+ # class FctContext:
66
+ # """
67
+ # fct 是 funboost current task 的简写
68
+ # """
69
+ #
70
+ # def __init__(self, function_params: dict,
71
+ # full_msg: dict,
72
+ # function_result_status: FunctionResultStatus,
73
+ # logger: logging.Logger,
74
+ # asyncio_use_thread_concurrent_mode: bool = False):
75
+ # self.function_params = function_params
76
+ # self.full_msg = full_msg
77
+ # self.function_result_status = function_result_status
78
+ # self.logger = logger
79
+ # self.asyncio_use_thread_concurrent_mode = asyncio_use_thread_concurrent_mode
80
+
81
+
82
+ class _BaseCurrentTask(metaclass=abc.ABCMeta):
83
+ @abc.abstractmethod
84
+ def set_fct_context(self, fct_context: FctContext):
85
+ raise NotImplemented
86
+
87
+ @abc.abstractmethod
88
+ def get_fct_context(self) -> FctContext:
89
+ raise NotImplemented
90
+
91
+ @property
92
+ def function_params(self):
93
+ return self.get_fct_context().function_params
94
+
95
+ @property
96
+ def full_msg(self) -> dict:
97
+ return self.get_fct_context().full_msg
98
+
99
+ @property
100
+ def function_result_status(self) -> FunctionResultStatus:
101
+ return self.get_fct_context().function_result_status
102
+
103
+ @property
104
+ def task_id(self) -> FunctionResultStatus:
105
+ return self.function_result_status.task_id
106
+
107
+ @property
108
+ def logger(self) -> logging.Logger:
109
+ return self.get_fct_context().logger
110
+
111
+ def __str__(self):
112
+ return f'<{self.__class__.__name__} [{self.function_result_status.get_status_dict()}]>'
113
+
114
+
115
+ class __ThreadCurrentTask(_BaseCurrentTask):
116
+ """
117
+ 用于在用户自己函数内部去获取 消息的完整体,当前重试次数等.
118
+ """
119
+
120
+ _fct_local_data = threading.local()
121
+
122
+ def set_fct_context(self, fct_context: FctContext):
123
+ self._fct_local_data.fct_context = fct_context
124
+
125
+ def get_fct_context(self) -> FctContext:
126
+ return self._fct_local_data.fct_context
127
+
128
+
129
+ class __AsyncioCurrentTask(_BaseCurrentTask):
130
+ _fct_context = contextvars.ContextVar('fct_context')
131
+
132
+ def set_fct_context(self, fct_context: FctContext):
133
+ self._fct_context.set(fct_context)
134
+
135
+ def get_fct_context(self) -> FctContext:
136
+ return self._fct_context.get()
137
+
138
+
139
+ thread_current_task = __ThreadCurrentTask()
140
+ asyncio_current_task = __AsyncioCurrentTask()
141
+
142
+
143
+ def is_asyncio_environment():
144
+ try:
145
+ asyncio.get_running_loop()
146
+ return True
147
+ except RuntimeError:
148
+ return False
149
+
150
+
151
+ def funboost_current_task():
152
+ if is_asyncio_environment():
153
+ if thread_current_task.get_fct_context().asyncio_use_thread_concurrent_mode is True:
154
+ # 如果用户使用的是默认的ConcurrentModeEnum.THREADING并发模式来运行async def 函数,那么也使用线程获取上下文
155
+ return thread_current_task
156
+ else:
157
+ return asyncio_current_task
158
+ else:
159
+ return thread_current_task
160
+
161
+
162
+ def get_current_taskid():
163
+ fct = funboost_current_task()
164
+ # return fct.function_result_status.task_id
165
+ try:
166
+ return fct.task_id # 不在funboost的消费函数里面就获取不到上下文了
167
+ except (AttributeError, LookupError) as e:
168
+ # print(e,type(e))
169
+ return 'no_task_id'
170
+
171
+
172
+ class FctContextThread(threading.Thread):
173
+ """
174
+ 这个类自动把当前线程的 线程上下文 自动传递给新开的线程。
175
+ """
176
+ def __init__(self, group=None, target=None, name=None,
177
+ args=(), kwargs=None, *, daemon=None,
178
+ ):
179
+ threading.Thread.__init__(**locals())
180
+ self.fct_context = thread_current_task.get_fct_context()
181
+
182
+ def run(self):
183
+ thread_current_task.set_fct_context(self.fct_context)
184
+ super().run()
185
+
186
+
187
+ if __name__ == '__main__':
188
+ print(is_asyncio_environment())
189
+ print()
190
+ for i in range(2):
191
+ funboost_current_task()
192
+ print(get_current_taskid())
193
+ print()
@@ -10,6 +10,8 @@ from funboost.concurrent_pool import FunboostBaseConcurrentPool, FlexibleThreadP
10
10
  from funboost.constant import ConcurrentModeEnum, BrokerEnum
11
11
  from pydantic import BaseModel, validator, root_validator, BaseConfig, Field
12
12
 
13
+ from funboost.core.lazy_impoter import funboost_lazy_impoter
14
+
13
15
 
14
16
  def _patch_for_pydantic_field_deepcopy():
15
17
  from concurrent.futures import ThreadPoolExecutor
@@ -191,6 +193,10 @@ class BoosterParams(BaseJsonAbleModel):
191
193
  # func_params_is_pydantic_model: bool = False # funboost 兼容支持 函数娼还是 pydantic model类型,funboost在发布之前和取出来时候自己转化。
192
194
 
193
195
  auto_generate_info: dict = {} # 自动生成的信息,不需要用户主动传参.
196
+ consuming_function_class:typing.Optional[typing.Type] = None
197
+ consuming_function_kind :typing.Optional[str]= None #自动生成的信息,不需要用户主动传参.
198
+ consuming_function_class_module:typing.Optional[str] = None #自动生成的信息,不需要用户主动传参.
199
+ consuming_function_class_name: typing.Optional[str] = None #自动生成的信息,不需要用户主动传参.
194
200
 
195
201
  @root_validator(skip_on_failure=True)
196
202
  def check_values(cls, values: dict):
@@ -213,6 +219,19 @@ class BoosterParams(BaseJsonAbleModel):
213
219
  raise ValueError(f'{cls.__name__} 的字段新增了父类 BoosterParams 不存在的字段 "{k}"') # 使 BoosterParams的子类,不能增加字段,只能覆盖字段.
214
220
  return values
215
221
 
222
+ def __call__(self, func):
223
+ """
224
+ 新增加一种语法
225
+ @BoosterParams(queue_name='q1',qps=2) 这个和 @boost(BoosterParams(queue_name='q1',qps=2)) 写法等效
226
+
227
+ @BoosterParams(queue_name='q1',qps=2)
228
+ def f(a,b):
229
+ print(a,b)
230
+ :param func:
231
+ :return:
232
+ """
233
+ return funboost_lazy_impoter.boost(self)(func)
234
+
216
235
 
217
236
  class BoosterParamsComplete(BoosterParams):
218
237
  """
@@ -275,6 +294,10 @@ class PublisherParams(BaseJsonAbleModel):
275
294
  publisher_override_cls: typing.Optional[typing.Type] = None
276
295
  # func_params_is_pydantic_model: bool = False # funboost 兼容支持 函数娼还是 pydantic model类型,funboost在发布之前和取出来时候自己转化。
277
296
 
297
+ consuming_function_kind: typing.Optional[str] = None # 自动生成的信息,不需要用户主动传参.
298
+ consuming_function_class_module: typing.Optional[str] = None # 自动生成的信息,不需要用户主动传参.
299
+ consuming_function_class_name: typing.Optional[str] = None # 自动生成的信息,不需要用户主动传参.
300
+
278
301
 
279
302
  if __name__ == '__main__':
280
303
  from funboost.concurrent_pool import FlexibleThreadPool
@@ -16,8 +16,14 @@ class FunboostLazyImpoter(SingletonBaseNew):
16
16
  @property
17
17
  @cached_method_result
18
18
  def BoostersManager(self):
19
- from funboost.core.booster import BoostersManager
20
- return BoostersManager
19
+ from funboost.core import booster
20
+ return booster.BoostersManager
21
+
22
+ @property
23
+ @cached_method_result
24
+ def boost(self):
25
+ from funboost.core import booster
26
+ return booster.boost
21
27
 
22
28
  # @property
23
29
  # @cached_method_result
@@ -16,6 +16,7 @@ from threading import Lock
16
16
  import amqpstorm
17
17
 
18
18
  import nb_log
19
+ from funboost.constant import ConstStrForClassMethod, FunctionKind
19
20
  from funboost.core.func_params_model import PublisherParams, PriorityConsumingControlConfig
20
21
  from funboost.core.helper_funs import MsgGenerater
21
22
  from funboost.core.loggers import develop_logger
@@ -29,6 +30,8 @@ from funboost.core.task_id_logger import TaskIdLogger
29
30
  from funboost.utils import decorators
30
31
  from funboost.funboost_config_deafult import BrokerConnConfig, FunboostCommonConfig
31
32
 
33
+
34
+
32
35
  RedisAsyncResult = AsyncResult # 别名
33
36
  RedisAioAsyncResult = AioAsyncResult # 别名
34
37
 
@@ -243,15 +246,31 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
243
246
  :param func_kwargs:
244
247
  :return:
245
248
  """
246
- # print(func_args,func_kwargs,self.publish_params_checker.all_arg_name)
249
+ # print(func_args, func_kwargs, self.publish_params_checker.all_arg_name)
247
250
  msg_dict = func_kwargs
248
251
  # print(msg_dict)
249
252
  # print(self.publish_params_checker.position_arg_name_list)
250
253
  # print(func_args)
251
- for index, arg in enumerate(func_args):
254
+ func_args_list = list(func_args)
255
+ if self.publisher_params.consuming_function_kind == FunctionKind.CLASS_METHOD:
256
+ # print(self.publish_params_checker.all_arg_name[0])
257
+ # func_args_list.insert(0, {'first_param_name': self.publish_params_checker.all_arg_name[0],
258
+ # 'cls_type': ClsHelper.get_classs_method_cls(self.publisher_params.consuming_function).__name__},
259
+ # )
260
+ func_args_list.insert(0, {ConstStrForClassMethod.FIRST_PARAM_NAME: self.publish_params_checker.all_arg_name[0],
261
+ ConstStrForClassMethod.CLS_NAME: self.publisher_params.consuming_function_class_name,})
262
+ elif self.publisher_params.consuming_function_kind == FunctionKind.INSTANCE_METHOD:
263
+ if not hasattr(func_args[0],ConstStrForClassMethod.OBJ_INIT_PARAMS):
264
+ raise ValueError(f'消费函数 {self.publisher_params.consuming_function} 是实例方法,实例必须有 {ConstStrForClassMethod.OBJ_INIT_PARAMS} 属性')
265
+ func_args_list[0] = {ConstStrForClassMethod.FIRST_PARAM_NAME: self.publish_params_checker.all_arg_name[0],
266
+ ConstStrForClassMethod.OBJ_INIT_PARAMS: getattr(func_args[0],ConstStrForClassMethod.OBJ_INIT_PARAMS),
267
+ ConstStrForClassMethod.CLS_NAME: self.publisher_params.consuming_function_class_name}
268
+
269
+ for index, arg in enumerate(func_args_list):
252
270
  # print(index,arg,self.publish_params_checker.position_arg_name_list)
253
271
  # msg_dict[self.publish_params_checker.position_arg_name_list[index]] = arg
254
272
  msg_dict[self.publish_params_checker.all_arg_name[index]] = arg
273
+
255
274
  # print(msg_dict)
256
275
  return self.publish(msg_dict)
257
276
 
@@ -100,7 +100,7 @@ def show_frame_config():
100
100
  # only_print_on_main_process(f'{var_name}: {var_value}')
101
101
  logger_prompt.debug(f'''读取的 BrokerConnConfig 配置是:\n {funboost_config_deafult.BrokerConnConfig().get_pwd_enc_json(indent=4)} ''')
102
102
 
103
- logger_prompt.debug(f'''读取的 FunboostCommonConfig 配置是:\n {funboost_config_deafult.FunboostCommonConfig().get_json(indent=None)} ''')
103
+ logger_prompt.debug(f'''读取的 FunboostCommonConfig 配置是:\n {funboost_config_deafult.FunboostCommonConfig().get_json(indent=4)} ''')
104
104
 
105
105
  # only_print_on_main_process(f'读取的 BoostDecoratorDefaultParams 默认 @boost 装饰器入参的默认全局配置是: \n '
106
106
  # f'{funboost_config_deafult.BoostDecoratorDefaultParams().get_json()}')
@@ -118,6 +118,7 @@ def use_config_form_funboost_config_module():
118
118
  当第一次运行脚本时候,函数调度框架会在你的python当前项目的根目录下 {project_root_path} 下,创建一个名为 funboost_config.py 的文件。
119
119
  自动读取配置,会优先读取启动脚本的所在目录 {current_script_path} 的funboost_config.py文件,
120
120
  如果没有 {current_script_path}/funboost_config.py 文件,则读取项目根目录 {project_root_path} 下的funboost_config.py做配置。
121
+ 只要 funboost_config.py 在任意 PYTHONPATH 的文件夹下,就能自动读取到。
121
122
  在 "{project_root_path}/funboost_config.py:1" 文件中,需要按需重新设置要使用到的中间件的键和值,例如没有使用rabbitmq而是使用redis做中间件,则不需要配置rabbitmq。
122
123
  """
123
124
  # sys.stdout.write(f'\033[0;33m{time.strftime("%H:%M:%S")}\033[0m "{__file__}:{sys._getframe().f_lineno}" \033[0;30;43m{inspect_msg}\033[0m\n')