funboost 46.7__tar.gz → 46.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 (292) hide show
  1. {funboost-46.7/funboost.egg-info → funboost-46.9}/PKG-INFO +1 -1
  2. {funboost-46.7 → funboost-46.9}/funboost/__init__.py +1 -1
  3. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/custom_threadpool_executor.py +5 -0
  4. {funboost-46.7 → funboost-46.9}/funboost/consumers/base_consumer.py +13 -10
  5. {funboost-46.7 → funboost-46.9}/funboost/core/func_params_model.py +2 -2
  6. {funboost-46.7 → funboost-46.9}/funboost/timing_job/__init__.py +29 -31
  7. funboost-46.9/funboost/timing_job/apscheduler_use_redis_store.py +61 -0
  8. {funboost-46.7 → funboost-46.9}/funboost/utils/decorators.py +27 -0
  9. {funboost-46.7 → funboost-46.9}/funboost/utils/time_util.py +17 -16
  10. {funboost-46.7 → funboost-46.9/funboost.egg-info}/PKG-INFO +1 -1
  11. {funboost-46.7 → funboost-46.9}/funboost.egg-info/requires.txt +2 -2
  12. {funboost-46.7 → funboost-46.9}/setup.py +2 -2
  13. funboost-46.7/funboost/timing_job/apscheduler_use_redis_store.py +0 -30
  14. {funboost-46.7 → funboost-46.9}/LICENSE +0 -0
  15. {funboost-46.7 → funboost-46.9}/MANIFEST.in +0 -0
  16. {funboost-46.7 → funboost-46.9}/README.md +0 -0
  17. {funboost-46.7 → funboost-46.9}/funboost/__init__old.py +0 -0
  18. {funboost-46.7 → funboost-46.9}/funboost/__main__.py +0 -0
  19. {funboost-46.7 → funboost-46.9}/funboost/assist/__init__.py +0 -0
  20. {funboost-46.7 → funboost-46.9}/funboost/assist/celery_helper.py +0 -0
  21. {funboost-46.7 → funboost-46.9}/funboost/assist/dramatiq_helper.py +0 -0
  22. {funboost-46.7 → funboost-46.9}/funboost/assist/faststream_helper.py +0 -0
  23. {funboost-46.7 → funboost-46.9}/funboost/assist/huey_helper.py +0 -0
  24. {funboost-46.7 → funboost-46.9}/funboost/assist/rocketry_helper.py +0 -0
  25. {funboost-46.7 → funboost-46.9}/funboost/assist/rq_helper.py +0 -0
  26. {funboost-46.7 → funboost-46.9}/funboost/assist/rq_windows_worker.py +0 -0
  27. {funboost-46.7 → funboost-46.9}/funboost/assist/taskiq_helper.py +0 -0
  28. {funboost-46.7 → funboost-46.9}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
  29. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/__init__.py +0 -0
  30. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/async_helper.py +0 -0
  31. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/async_pool_executor.py +0 -0
  32. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/backup/__init__.py +0 -0
  33. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
  34. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
  35. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
  36. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/base_pool_type.py +0 -0
  37. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
  38. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
  39. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
  40. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
  41. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
  42. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
  43. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
  44. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
  45. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
  46. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/pool_commons.py +0 -0
  47. {funboost-46.7 → funboost-46.9}/funboost/concurrent_pool/single_thread_executor.py +0 -0
  48. {funboost-46.7 → funboost-46.9}/funboost/constant.py +0 -0
  49. {funboost-46.7 → funboost-46.9}/funboost/consumers/__init__.py +0 -0
  50. {funboost-46.7 → funboost-46.9}/funboost/consumers/celery_consumer.py +0 -0
  51. {funboost-46.7 → funboost-46.9}/funboost/consumers/confirm_mixin.py +0 -0
  52. {funboost-46.7 → funboost-46.9}/funboost/consumers/dramatiq_consumer.py +0 -0
  53. {funboost-46.7 → funboost-46.9}/funboost/consumers/empty_consumer.py +0 -0
  54. {funboost-46.7 → funboost-46.9}/funboost/consumers/faststream_consumer.py +0 -0
  55. {funboost-46.7 → funboost-46.9}/funboost/consumers/http_consumer.py +0 -0
  56. {funboost-46.7 → funboost-46.9}/funboost/consumers/http_consumer000.py +0 -0
  57. {funboost-46.7 → funboost-46.9}/funboost/consumers/httpsqs_consumer.py +0 -0
  58. {funboost-46.7 → funboost-46.9}/funboost/consumers/huey_consumer.py +0 -0
  59. {funboost-46.7 → funboost-46.9}/funboost/consumers/kafka_consumer.py +0 -0
  60. {funboost-46.7 → funboost-46.9}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
  61. {funboost-46.7 → funboost-46.9}/funboost/consumers/kombu_consumer.py +0 -0
  62. {funboost-46.7 → funboost-46.9}/funboost/consumers/local_python_queue_consumer.py +0 -0
  63. {funboost-46.7 → funboost-46.9}/funboost/consumers/memory_deque_consumer.py +0 -0
  64. {funboost-46.7 → funboost-46.9}/funboost/consumers/mongomq_consumer.py +0 -0
  65. {funboost-46.7 → funboost-46.9}/funboost/consumers/mqtt_consumer.py +0 -0
  66. {funboost-46.7 → funboost-46.9}/funboost/consumers/nameko_consumer.py +0 -0
  67. {funboost-46.7 → funboost-46.9}/funboost/consumers/nats_consumer.py +0 -0
  68. {funboost-46.7 → funboost-46.9}/funboost/consumers/nsq_consumer.py +0 -0
  69. {funboost-46.7 → funboost-46.9}/funboost/consumers/peewee_conusmer.py +0 -0
  70. {funboost-46.7 → funboost-46.9}/funboost/consumers/persist_queue_consumer.py +0 -0
  71. {funboost-46.7 → funboost-46.9}/funboost/consumers/pulsar_consumer.py +0 -0
  72. {funboost-46.7 → funboost-46.9}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
  73. {funboost-46.7 → funboost-46.9}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
  74. {funboost-46.7 → funboost-46.9}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
  75. {funboost-46.7 → funboost-46.9}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
  76. {funboost-46.7 → funboost-46.9}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
  77. {funboost-46.7 → funboost-46.9}/funboost/consumers/redis_consumer.py +0 -0
  78. {funboost-46.7 → funboost-46.9}/funboost/consumers/redis_consumer_ack_able.py +0 -0
  79. {funboost-46.7 → funboost-46.9}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
  80. {funboost-46.7 → funboost-46.9}/funboost/consumers/redis_consumer_priority.py +0 -0
  81. {funboost-46.7 → funboost-46.9}/funboost/consumers/redis_consumer_simple.py +0 -0
  82. {funboost-46.7 → funboost-46.9}/funboost/consumers/redis_filter.py +0 -0
  83. {funboost-46.7 → funboost-46.9}/funboost/consumers/redis_pubsub_consumer.py +0 -0
  84. {funboost-46.7 → funboost-46.9}/funboost/consumers/redis_stream_consumer.py +0 -0
  85. {funboost-46.7 → funboost-46.9}/funboost/consumers/rocketmq_consumer.py +0 -0
  86. {funboost-46.7 → funboost-46.9}/funboost/consumers/rq_consumer.py +0 -0
  87. {funboost-46.7 → funboost-46.9}/funboost/consumers/sqlachemy_consumer.py +0 -0
  88. {funboost-46.7 → funboost-46.9}/funboost/consumers/tcp_consumer.py +0 -0
  89. {funboost-46.7 → funboost-46.9}/funboost/consumers/txt_file_consumer.py +0 -0
  90. {funboost-46.7 → funboost-46.9}/funboost/consumers/udp_consumer.py +0 -0
  91. {funboost-46.7 → funboost-46.9}/funboost/consumers/zeromq_consumer.py +0 -0
  92. {funboost-46.7 → funboost-46.9}/funboost/contrib/__init__.py +0 -0
  93. {funboost-46.7 → funboost-46.9}/funboost/contrib/api_publish_msg.py +0 -0
  94. {funboost-46.7 → funboost-46.9}/funboost/contrib/django_db_deco.py +0 -0
  95. {funboost-46.7 → funboost-46.9}/funboost/contrib/queue2queue.py +0 -0
  96. {funboost-46.7 → funboost-46.9}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
  97. {funboost-46.7 → funboost-46.9}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
  98. {funboost-46.7 → funboost-46.9}/funboost/core/__init__.py +0 -0
  99. {funboost-46.7 → funboost-46.9}/funboost/core/active_cousumer_info_getter.py +0 -0
  100. {funboost-46.7 → funboost-46.9}/funboost/core/booster.py +0 -0
  101. {funboost-46.7 → funboost-46.9}/funboost/core/cli/__init__.py +0 -0
  102. {funboost-46.7 → funboost-46.9}/funboost/core/cli/discovery_boosters.py +0 -0
  103. {funboost-46.7 → funboost-46.9}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
  104. {funboost-46.7 → funboost-46.9}/funboost/core/cli/funboost_fire.py +0 -0
  105. {funboost-46.7 → funboost-46.9}/funboost/core/current_task.py +0 -0
  106. {funboost-46.7 → funboost-46.9}/funboost/core/exceptions.py +0 -0
  107. {funboost-46.7 → funboost-46.9}/funboost/core/fabric_deploy_helper.py +0 -0
  108. {funboost-46.7 → funboost-46.9}/funboost/core/funboost_config_getter.py +0 -0
  109. {funboost-46.7 → funboost-46.9}/funboost/core/funboost_time.py +0 -0
  110. {funboost-46.7 → funboost-46.9}/funboost/core/function_result_status_config.py +0 -0
  111. {funboost-46.7 → funboost-46.9}/funboost/core/function_result_status_saver.py +0 -0
  112. {funboost-46.7 → funboost-46.9}/funboost/core/helper_funs.py +0 -0
  113. {funboost-46.7 → funboost-46.9}/funboost/core/kill_remote_task.py +0 -0
  114. {funboost-46.7 → funboost-46.9}/funboost/core/lazy_impoter.py +0 -0
  115. {funboost-46.7 → funboost-46.9}/funboost/core/loggers.py +0 -0
  116. {funboost-46.7 → funboost-46.9}/funboost/core/msg_result_getter.py +0 -0
  117. {funboost-46.7 → funboost-46.9}/funboost/core/muliti_process_enhance.py +0 -0
  118. {funboost-46.7 → funboost-46.9}/funboost/core/serialization.py +0 -0
  119. {funboost-46.7 → funboost-46.9}/funboost/core/task_id_logger.py +0 -0
  120. {funboost-46.7 → funboost-46.9}/funboost/factories/__init__.py +0 -0
  121. {funboost-46.7 → funboost-46.9}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
  122. {funboost-46.7 → funboost-46.9}/funboost/factories/consumer_factory.py +0 -0
  123. {funboost-46.7 → funboost-46.9}/funboost/factories/publisher_factotry.py +0 -0
  124. {funboost-46.7 → funboost-46.9}/funboost/funboost_config_deafult.py +0 -0
  125. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
  126. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  127. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/app.py +0 -0
  128. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/functions.py +0 -0
  129. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/assets/css/custom.css +0 -0
  130. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
  131. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
  132. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/assets/js/custom.js +0 -0
  133. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
  134. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/css/style.css +0 -0
  135. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/images/bg.jpg +0 -0
  136. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/images/password.png +0 -0
  137. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/images/tick.png +0 -0
  138. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/images/user.png +0 -0
  139. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
  140. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/templates/index.html +0 -0
  141. {funboost-46.7 → funboost-46.9}/funboost/function_result_web/templates/login.html +0 -0
  142. {funboost-46.7 → funboost-46.9}/funboost/publishers/__init__.py +0 -0
  143. {funboost-46.7 → funboost-46.9}/funboost/publishers/base_publisher.py +0 -0
  144. {funboost-46.7 → funboost-46.9}/funboost/publishers/celery_publisher.py +0 -0
  145. {funboost-46.7 → funboost-46.9}/funboost/publishers/celery_publisher000.py +0 -0
  146. {funboost-46.7 → funboost-46.9}/funboost/publishers/confluent_kafka_publisher.py +0 -0
  147. {funboost-46.7 → funboost-46.9}/funboost/publishers/dramatiq_publisher.py +0 -0
  148. {funboost-46.7 → funboost-46.9}/funboost/publishers/empty_publisher.py +0 -0
  149. {funboost-46.7 → funboost-46.9}/funboost/publishers/faststream_publisher.py +0 -0
  150. {funboost-46.7 → funboost-46.9}/funboost/publishers/http_publisher.py +0 -0
  151. {funboost-46.7 → funboost-46.9}/funboost/publishers/httpsqs_publisher.py +0 -0
  152. {funboost-46.7 → funboost-46.9}/funboost/publishers/huey_publisher.py +0 -0
  153. {funboost-46.7 → funboost-46.9}/funboost/publishers/kafka_publisher.py +0 -0
  154. {funboost-46.7 → funboost-46.9}/funboost/publishers/kombu_publisher.py +0 -0
  155. {funboost-46.7 → funboost-46.9}/funboost/publishers/local_python_queue_publisher.py +0 -0
  156. {funboost-46.7 → funboost-46.9}/funboost/publishers/meomory_deque_publisher.py +0 -0
  157. {funboost-46.7 → funboost-46.9}/funboost/publishers/mongomq_publisher.py +0 -0
  158. {funboost-46.7 → funboost-46.9}/funboost/publishers/mqtt_publisher.py +0 -0
  159. {funboost-46.7 → funboost-46.9}/funboost/publishers/nameko_publisher.py +0 -0
  160. {funboost-46.7 → funboost-46.9}/funboost/publishers/nats_publisher.py +0 -0
  161. {funboost-46.7 → funboost-46.9}/funboost/publishers/nsq_publisher.py +0 -0
  162. {funboost-46.7 → funboost-46.9}/funboost/publishers/peewee_publisher.py +0 -0
  163. {funboost-46.7 → funboost-46.9}/funboost/publishers/persist_queue_publisher.py +0 -0
  164. {funboost-46.7 → funboost-46.9}/funboost/publishers/pulsar_publisher.py +0 -0
  165. {funboost-46.7 → funboost-46.9}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
  166. {funboost-46.7 → funboost-46.9}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
  167. {funboost-46.7 → funboost-46.9}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
  168. {funboost-46.7 → funboost-46.9}/funboost/publishers/redis_publisher.py +0 -0
  169. {funboost-46.7 → funboost-46.9}/funboost/publishers/redis_publisher_lpush.py +0 -0
  170. {funboost-46.7 → funboost-46.9}/funboost/publishers/redis_publisher_priority.py +0 -0
  171. {funboost-46.7 → funboost-46.9}/funboost/publishers/redis_publisher_simple.py +0 -0
  172. {funboost-46.7 → funboost-46.9}/funboost/publishers/redis_pubsub_publisher.py +0 -0
  173. {funboost-46.7 → funboost-46.9}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
  174. {funboost-46.7 → funboost-46.9}/funboost/publishers/redis_stream_publisher.py +0 -0
  175. {funboost-46.7 → funboost-46.9}/funboost/publishers/rocketmq_publisher.py +0 -0
  176. {funboost-46.7 → funboost-46.9}/funboost/publishers/rq_publisher.py +0 -0
  177. {funboost-46.7 → funboost-46.9}/funboost/publishers/sqla_queue_publisher.py +0 -0
  178. {funboost-46.7 → funboost-46.9}/funboost/publishers/tcp_publisher.py +0 -0
  179. {funboost-46.7 → funboost-46.9}/funboost/publishers/txt_file_publisher.py +0 -0
  180. {funboost-46.7 → funboost-46.9}/funboost/publishers/udp_publisher.py +0 -0
  181. {funboost-46.7 → funboost-46.9}/funboost/publishers/zeromq_publisher.py +0 -0
  182. {funboost-46.7 → funboost-46.9}/funboost/queues/__init__.py +0 -0
  183. {funboost-46.7 → funboost-46.9}/funboost/queues/memory_queues_map.py +0 -0
  184. {funboost-46.7 → funboost-46.9}/funboost/queues/peewee_queue.py +0 -0
  185. {funboost-46.7 → funboost-46.9}/funboost/queues/sqla_queue.py +0 -0
  186. {funboost-46.7 → funboost-46.9}/funboost/set_frame_config.py +0 -0
  187. {funboost-46.7 → funboost-46.9}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
  188. {funboost-46.7 → funboost-46.9}/funboost/utils/__init__.py +0 -0
  189. {funboost-46.7 → funboost-46.9}/funboost/utils/apscheduler_monkey.py +0 -0
  190. {funboost-46.7 → funboost-46.9}/funboost/utils/block_exit.py +0 -0
  191. {funboost-46.7 → funboost-46.9}/funboost/utils/bulk_operation.py +0 -0
  192. {funboost-46.7 → funboost-46.9}/funboost/utils/class_utils.py +0 -0
  193. {funboost-46.7 → funboost-46.9}/funboost/utils/ctrl_c_end.py +0 -0
  194. {funboost-46.7 → funboost-46.9}/funboost/utils/custom_pysnooper.py +0 -0
  195. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages/__init__.py +0 -0
  196. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
  197. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
  198. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
  199. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
  200. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
  201. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
  202. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
  203. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
  204. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
  205. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  206. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
  207. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
  208. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  209. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
  210. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
  211. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
  212. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
  213. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
  214. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
  215. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
  216. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
  217. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
  218. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
  219. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  220. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
  221. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
  222. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
  223. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
  224. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
  225. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
  226. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
  227. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
  228. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
  229. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
  230. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
  231. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
  232. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
  233. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
  234. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
  235. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
  236. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
  237. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
  238. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
  239. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
  240. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
  241. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
  242. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
  243. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
  244. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
  245. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
  246. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
  247. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
  248. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
  249. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
  250. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
  251. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
  252. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
  253. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
  254. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
  255. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
  256. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
  257. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
  258. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
  259. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
  260. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
  261. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
  262. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
  263. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
  264. {funboost-46.7 → funboost-46.9}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
  265. {funboost-46.7 → funboost-46.9}/funboost/utils/develop_log.py +0 -0
  266. {funboost-46.7 → funboost-46.9}/funboost/utils/expire_lock.py +0 -0
  267. {funboost-46.7 → funboost-46.9}/funboost/utils/json_helper.py +0 -0
  268. {funboost-46.7 → funboost-46.9}/funboost/utils/mongo_util.py +0 -0
  269. {funboost-46.7 → funboost-46.9}/funboost/utils/monkey_color_log.py +0 -0
  270. {funboost-46.7 → funboost-46.9}/funboost/utils/monkey_patches.py +0 -0
  271. {funboost-46.7 → funboost-46.9}/funboost/utils/mqtt_util.py +0 -0
  272. {funboost-46.7 → funboost-46.9}/funboost/utils/paramiko_util.py +0 -0
  273. {funboost-46.7 → funboost-46.9}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
  274. {funboost-46.7 → funboost-46.9}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
  275. {funboost-46.7 → funboost-46.9}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
  276. {funboost-46.7 → funboost-46.9}/funboost/utils/pysnooper_ydf/utils.py +0 -0
  277. {funboost-46.7 → funboost-46.9}/funboost/utils/pysnooper_ydf/variables.py +0 -0
  278. {funboost-46.7 → funboost-46.9}/funboost/utils/rabbitmq_factory.py +0 -0
  279. {funboost-46.7 → funboost-46.9}/funboost/utils/redis_manager.py +0 -0
  280. {funboost-46.7 → funboost-46.9}/funboost/utils/redis_manager_old.py +0 -0
  281. {funboost-46.7 → funboost-46.9}/funboost/utils/resource_monitoring.py +0 -0
  282. {funboost-46.7 → funboost-46.9}/funboost/utils/restart_python.py +0 -0
  283. {funboost-46.7 → funboost-46.9}/funboost/utils/simple_data_class.py +0 -0
  284. {funboost-46.7 → funboost-46.9}/funboost/utils/str_utils.py +0 -0
  285. {funboost-46.7 → funboost-46.9}/funboost/utils/times/__init__.py +0 -0
  286. {funboost-46.7 → funboost-46.9}/funboost/utils/times/version.py +0 -0
  287. {funboost-46.7 → funboost-46.9}/funboost/utils/un_strict_json_dumps.py +0 -0
  288. {funboost-46.7 → funboost-46.9}/funboost.egg-info/SOURCES.txt +0 -0
  289. {funboost-46.7 → funboost-46.9}/funboost.egg-info/dependency_links.txt +0 -0
  290. {funboost-46.7 → funboost-46.9}/funboost.egg-info/entry_points.txt +0 -0
  291. {funboost-46.7 → funboost-46.9}/funboost.egg-info/top_level.txt +0 -0
  292. {funboost-46.7 → funboost-46.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 46.7
3
+ Version: 46.9
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -13,7 +13,7 @@ set_frame_config这个模块的 use_config_form_funboost_config_module() 是核
13
13
  这段注释说明和使用的用户无关,只和框架开发人员有关.
14
14
  '''
15
15
 
16
- __version__ = "46.7"
16
+ __version__ = "46.9"
17
17
 
18
18
  from funboost.set_frame_config import show_frame_config
19
19
 
@@ -19,6 +19,8 @@
19
19
 
20
20
  可以在各种地方加入 time.sleep 来验证 第1条和第2条的自动智能缩放功能。
21
21
  """
22
+ import logging
23
+
22
24
  import os
23
25
  import atexit
24
26
  import queue
@@ -175,6 +177,9 @@ class _CustomThread(threading.Thread, FunboostFileLoggerMixin, LoggerLevelSetter
175
177
  # noinspection PyProtectedMember
176
178
  def run(self):
177
179
  # noinspection PyUnresolvedReferences
180
+ # print(logging.getLogger(None).level,logging.getLogger(None).handlers)
181
+ # print(self.logger.level)
182
+ # print(self.logger.handlers)
178
183
  self.logger.debug(f'新启动线程 {self._ident} ')
179
184
  self._executorx._change_threads_free_count(1)
180
185
  while True:
@@ -13,6 +13,7 @@ import typing
13
13
  import abc
14
14
  import copy
15
15
  from apscheduler.jobstores.memory import MemoryJobStore
16
+ from funboost.core.funboost_time import FunboostTime
16
17
  from pathlib import Path
17
18
  # from multiprocessing import Process
18
19
  import datetime
@@ -369,7 +370,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
369
370
 
370
371
  def _start_delay_task_scheduler(self):
371
372
  from funboost.timing_job import FsdfBackgroundScheduler
372
- from funboost.timing_job import FunboostBackgroundSchedulerProcessJobsWithinRedisLock
373
+ from funboost.timing_job.apscheduler_use_redis_store import FunboostBackgroundSchedulerProcessJobsWithinRedisLock
373
374
  # print(self.consumer_params.delay_task_apsscheduler_jobstores_kind )
374
375
  if self.consumer_params.delay_task_apscheduler_jobstores_kind == 'redis':
375
376
  jobstores = {
@@ -392,7 +393,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
392
393
  raise Exception(f'delay_task_apsscheduler_jobstores_kind is error: {self.consumer_params.delay_task_apscheduler_jobstores_kind}')
393
394
 
394
395
 
395
- self._delay_task_scheduler.add_executor(ApschedulerThreadPoolExecutor(2)) # 只是运行submit任务到并发池,不需要很多线程。
396
+ # self._delay_task_scheduler.add_executor(ApschedulerThreadPoolExecutor(2)) # 只是运行submit任务到并发池,不需要很多线程。
396
397
  # self._delay_task_scheduler.add_listener(self._apscheduler_job_miss, EVENT_JOB_MISSED)
397
398
  self._delay_task_scheduler.start()
398
399
 
@@ -401,11 +402,12 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
401
402
  logger_apscheduler = get_logger('push_for_apscheduler_use_database_store', log_filename='push_for_apscheduler_use_database_store.log')
402
403
 
403
404
  @classmethod
404
- def _push_for_apscheduler_use_database_store(cls, queue_name, msg, runonce_uuid):
405
- key = 'apscheduler.redisjobstore_runonce'
406
- if RedisMixin().redis_db_frame.sadd(key, runonce_uuid): # 这样可以阻止多次启动同队列名消费者 redis jobstore多次运行函数.
407
- cls.logger_apscheduler.debug(f'延时任务用普通消息重新发布到普通队列 {msg}')
408
- funboost_lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
405
+ def _push_apscheduler_task_to_broker(cls, queue_name, msg, runonce_uuid):
406
+ funboost_lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
407
+ # key = 'apscheduler.redisjobstore_runonce'
408
+ # if RedisMixin().redis_db_frame.sadd(key, runonce_uuid): # 这样可以阻止多次启动同队列名消费者 redis jobstore多次运行函数.
409
+ # cls.logger_apscheduler.debug(f'延时任务用普通消息重新发布到普通队列 {msg}')
410
+ # funboost_lazy_impoter.BoostersManager.get_or_create_booster_by_queue_name(queue_name).publish(msg)
409
411
 
410
412
  @abc.abstractmethod
411
413
  def _shedual_task(self):
@@ -486,9 +488,10 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
486
488
  run_date = None
487
489
  # print(kw)
488
490
  if msg_countdown:
489
- run_date = time_util.DatetimeConverter(kw['body']['extra']['publish_time']).datetime_obj + datetime.timedelta(seconds=msg_countdown)
491
+ run_date = FunboostTime(kw['body']['extra']['publish_time']).datetime_obj + datetime.timedelta(seconds=msg_countdown)
490
492
  if msg_eta:
491
- run_date = time_util.DatetimeConverter(msg_eta).datetime_obj
493
+
494
+ run_date = FunboostTime(msg_eta).datetime_obj
492
495
  # print(run_date,time_util.DatetimeConverter().datetime_obj)
493
496
  # print(run_date.timestamp(),time_util.DatetimeConverter().datetime_obj.timestamp())
494
497
  # print(self.concurrent_pool)
@@ -507,7 +510,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
507
510
  self.__delete_eta_countdown(msg_no_delay)
508
511
  # print(msg_no_delay)
509
512
  # 数据库作为apscheduler的jobstores时候, 不能用 self.pbulisher_of_same_queue.publish,self不能序列化
510
- self._delay_task_scheduler.add_job(self._push_for_apscheduler_use_database_store, 'date', run_date=run_date,
513
+ self._delay_task_scheduler.add_job(self._push_apscheduler_task_to_broker, 'date', run_date=run_date,
511
514
  kwargs={'queue_name': self.queue_name, 'msg': msg_no_delay, 'runonce_uuid': str(uuid.uuid4())},
512
515
  misfire_grace_time=misfire_grace_time,
513
516
  )
@@ -194,7 +194,7 @@ class BoosterParams(BaseJsonAbleModel):
194
194
  broker_exclusive_config: dict = {} # 加上一个不同种类中间件非通用的配置,不同中间件自身独有的配置,不是所有中间件都兼容的配置,因为框架支持30种消息队列,消息队列不仅仅是一般的先进先出queue这么简单的概念,
195
195
  # 例如kafka支持消费者组,rabbitmq也支持各种独特概念例如各种ack机制 复杂路由机制,有的中间件原生能支持消息优先级有的中间件不支持,每一种消息队列都有独特的配置参数意义,可以通过这里传递。每种中间件能传递的键值对可以看consumer类的 BROKER_EXCLUSIVE_CONFIG_DEFAULT
196
196
 
197
- should_check_publish_func_params: bool = True # 消息发布时候是否校验消息发布内容,比如有的人发布消息,函数只接受a,b两个入参,他去传2个入参,或者传参不存在的参数名字, 如果消费函数你非要写*args,**kwargs,那就需要关掉发布消息时候的函数入参检查
197
+ should_check_publish_func_params: bool = True # 消息发布时候是否校验消息发布内容,比如有的人发布消息,函数只接受a,b两个入参,他去传2个入参,或者传参不存在的参数名字; 如果消费函数加了装饰器 ,你非要写*args,**kwargs,那就需要关掉发布消息时候的函数入参检查
198
198
 
199
199
  consumer_override_cls: typing.Optional[typing.Type] = None # 使用 consumer_override_cls 和 publisher_override_cls 来自定义重写或新增消费者 发布者,见文档4.21b介绍,
200
200
  publisher_override_cls: typing.Optional[typing.Type] = None
@@ -283,7 +283,7 @@ class PriorityConsumingControlConfig(BaseJsonAbleModel):
283
283
  is_using_rpc_mode: bool = None
284
284
 
285
285
  countdown: typing.Union[float, int] = None
286
- eta: datetime.datetime = None
286
+ eta: typing.Union[datetime.datetime, str] = None # 时间对象, 或 %Y-%m-%d %H:%M:%S 字符串。
287
287
  misfire_grace_time: typing.Union[int, None] = None
288
288
 
289
289
  other_extra_params: dict = None # 其他参数, 例如消息优先级 , priority_control_config=PriorityConsumingControlConfig(other_extra_params={'priroty': priorityxx}),
@@ -2,30 +2,27 @@
2
2
  集成定时任务。
3
3
  """
4
4
  import atexit
5
- import copy
6
- import importlib
7
-
8
- import pickle
9
5
 
10
6
  import time
11
- from funboost.utils.decorators import RedisDistributedLockContextManager
7
+ from apscheduler.executors.pool import BasePoolExecutor
8
+
12
9
  from typing import Union
13
10
  import threading
14
11
 
15
12
  from apscheduler.schedulers.background import BackgroundScheduler
16
- from apscheduler.jobstores.redis import RedisJobStore
17
13
  # noinspection PyProtectedMember
18
14
  from apscheduler.schedulers.base import STATE_STOPPED, STATE_RUNNING
19
- from apscheduler.util import undefined,TIMEOUT_MAX
15
+ from apscheduler.util import undefined, TIMEOUT_MAX
20
16
  import deprecated
21
17
  from funboost.utils.redis_manager import RedisMixin
22
18
 
23
- from funboost.funboost_config_deafult import BrokerConnConfig, FunboostCommonConfig
19
+ from funboost.funboost_config_deafult import FunboostCommonConfig
24
20
 
25
21
  from funboost.consumers.base_consumer import AbstractConsumer
26
22
  from funboost.core.booster import BoostersManager, Booster
27
- from funboost.publishers.base_publisher import AbstractPublisher
23
+
28
24
  from funboost import BoosterParams
25
+ from funboost.concurrent_pool.custom_threadpool_executor import ThreadPoolExecutorShrinkAble
29
26
 
30
27
 
31
28
  @deprecated.deprecated(reason='以后不要再使用这种方式,对于job_store为数据库时候需要序列化不好。使用内存和数据库都兼容的添加任务方式: add_push_job')
@@ -46,8 +43,9 @@ def push_fun_params_to_broker(queue_name: str, *args, runonce_uuid=None, **kwarg
46
43
  queue_name 队列名字
47
44
  *args **kwargs 是消费函数的入参
48
45
  发布消息中可以包括,runonce_uuid这个入参,确保分布式多个脚本都启动了定时器,导致每个定时器重复发布到消息队列,值你自己写 str(uuid.uuid4())
46
+ # 不需要传递 runonce_uuid 了,已经用专门的 FunboostBackgroundSchedulerProcessJobsWithinRedisLock 解决了。
49
47
  """
50
- if runonce_uuid:
48
+ if runonce_uuid: # 不需要传递 runonce_uuid 了,已经用专门的 FunboostBackgroundSchedulerProcessJobsWithinRedisLock 解决了 process_jobs的问题。
51
49
  key = 'apscheduler.redisjobstore_runonce2'
52
50
  if RedisMixin().redis_db_frame.sadd(key, runonce_uuid):
53
51
  BoostersManager.get_or_create_booster_by_queue_name(queue_name).push(*args, **kwargs)
@@ -55,6 +53,22 @@ def push_fun_params_to_broker(queue_name: str, *args, runonce_uuid=None, **kwarg
55
53
  BoostersManager.get_or_create_booster_by_queue_name(queue_name).push(*args, **kwargs)
56
54
 
57
55
 
56
+ class ThreadPoolExecutorForAps(BasePoolExecutor):
57
+ """
58
+ An executor that runs jobs in a concurrent.futures thread pool.
59
+
60
+ Plugin alias: ``threadpool``
61
+
62
+ :param max_workers: the maximum number of spawned threads.
63
+ :param pool_kwargs: dict of keyword arguments to pass to the underlying
64
+ ThreadPoolExecutor constructor
65
+ """
66
+
67
+ def __init__(self, max_workers=10, pool_kwargs=None):
68
+ pool = ThreadPoolExecutorShrinkAble(int(max_workers), )
69
+ super().__init__(pool)
70
+
71
+
58
72
  class FunboostBackgroundScheduler(BackgroundScheduler):
59
73
  """
60
74
  自定义的, 继承了官方BackgroundScheduler,
@@ -109,7 +123,7 @@ class FunboostBackgroundScheduler(BackgroundScheduler):
109
123
  args_list.insert(0, func.queue_name)
110
124
  args = tuple(args_list)
111
125
  kwargs = kwargs or {}
112
- kwargs['runonce_uuid'] = runonce_uuid
126
+ kwargs['runonce_uuid'] = runonce_uuid # 忽略,用户不需要传递runonce_uuid入参。
113
127
  return self.add_job(push_fun_params_to_broker, trigger, args, kwargs, id, name,
114
128
  misfire_grace_time, coalesce, max_instances,
115
129
  next_run_time, jobstore, executor,
@@ -150,37 +164,21 @@ class FunboostBackgroundScheduler(BackgroundScheduler):
150
164
  或者下一个需要运行的任务的wait_seconds是3600秒后,此时新加了一个动态任务需要3600秒后,
151
165
  现在最多只需要1秒就能扫描到动态新增的定时任务了。
152
166
  """
153
- MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS = 1.5
167
+ MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS = 0.5
154
168
  wait_seconds = None
155
169
  while self.state == STATE_RUNNING:
156
170
  if wait_seconds is None:
157
171
  wait_seconds = MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS
158
172
  self._last_wait_seconds = min(wait_seconds, MAX_WAIT_SECONDS_FOR_NEX_PROCESS_JOBS)
159
- if wait_seconds in (None,TIMEOUT_MAX):
173
+ if wait_seconds in (None, TIMEOUT_MAX):
160
174
  self._last_has_task = False
161
175
  else:
162
176
  self._last_has_task = True
163
177
  time.sleep(self._last_wait_seconds) # 这个要取最小值,不然例如定时间隔0.1秒运行,不取最小值,不会每隔0.1秒运行。
164
178
  wait_seconds = self._process_jobs()
165
179
 
166
-
167
- class FunboostBackgroundSchedulerProcessJobsWithinRedisLock(FunboostBackgroundScheduler):
168
- process_jobs_redis_lock_key = f'funboost.BackgroundSchedulerProcessJobsWithinRedisLock'
169
-
170
- def set_process_jobs_redis_lock_key(self,lock_key):
171
- self.process_jobs_redis_lock_key = lock_key
172
-
173
- def _process_jobs(self):
174
- for i in range(10) :
175
- with RedisDistributedLockContextManager(RedisMixin().redis_db_frame, self.process_jobs_redis_lock_key, ) as lock:
176
- if lock.has_aquire_lock:
177
- wait_seconds = super()._process_jobs()
178
- return wait_seconds
179
- else:
180
- time.sleep(0.1)
181
- return 0.1
182
-
183
-
180
+ def _create_default_executor(self):
181
+ return ThreadPoolExecutorForAps() # 必须是apscheduler pool的子类
184
182
 
185
183
 
186
184
  FsdfBackgroundScheduler = FunboostBackgroundScheduler # 兼容一下名字,fsdf是 function-scheduling-distributed-framework 老框架名字的缩写
@@ -0,0 +1,61 @@
1
+ from apscheduler.jobstores.redis import RedisJobStore
2
+ from funboost.utils.redis_manager import RedisMixin
3
+
4
+ from funboost.timing_job import FunboostBackgroundScheduler
5
+ from funboost.funboost_config_deafult import BrokerConnConfig, FunboostCommonConfig
6
+ from funboost.utils.decorators import RedisDistributedBlockLockContextManager
7
+
8
+ """
9
+ 这个是使用redis作为定时任务持久化,支持跨机器好跨进程,外部远程 动态修改/添加/删除定时任务
10
+ """
11
+
12
+
13
+ class FunboostBackgroundSchedulerProcessJobsWithinRedisLock(FunboostBackgroundScheduler):
14
+ """
15
+ 分布式或多进程都启动某个apscheduler实例,如果都使用的同一个数据库类型的jobstores ,_process_jobs有很大概率会造成报错, 因为_process_jobs使用的是线程锁,管不了其他进程和分布式机器。
16
+
17
+ https://groups.google.com/g/apscheduler/c/Gjc_JQMPePc 问题也提到了这个bug
18
+
19
+ 继承 Custom schedulers https://apscheduler.readthedocs.io/en/3.x/extending.html 可以重写 _create_lock
20
+ """
21
+
22
+ process_jobs_redis_lock_key = f'funboost.BackgroundSchedulerProcessJobsWithinRedisLock'
23
+
24
+ def set_process_jobs_redis_lock_key(self, lock_key):
25
+ self.process_jobs_redis_lock_key = lock_key
26
+
27
+ # def _create_lock(self):
28
+ # return RedisDistributedBlockLockContextManager(RedisMixin().redis_db_frame,self.process_jobs_redis_lock_key,) 这个类的写法不适合固定的单例,
29
+ # RedisDistributedBlockLockContextManager的写法不适合 永远用一个 对象,所以还是放到 def _process_jobs 里面运行
30
+
31
+ # def _process_jobs(self):
32
+ # for i in range(10) :
33
+ # with RedisDistributedLockContextManager(RedisMixin().redis_db_frame, self.process_jobs_redis_lock_key, ) as lock:
34
+ # if lock.has_aquire_lock:
35
+ # wait_seconds = super()._process_jobs()
36
+ # return wait_seconds
37
+ # else:
38
+ # time.sleep(0.1)
39
+ # return 0.1
40
+
41
+ def _process_jobs(self):
42
+ with RedisDistributedBlockLockContextManager(RedisMixin().redis_db_frame, self.process_jobs_redis_lock_key, ):
43
+ return super()._process_jobs()
44
+
45
+
46
+ jobstores = {
47
+ "default": RedisJobStore(db=BrokerConnConfig.REDIS_DB, host=BrokerConnConfig.REDIS_HOST,
48
+ port=BrokerConnConfig.REDIS_PORT, password=BrokerConnConfig.REDIS_PASSWORD,
49
+ username=BrokerConnConfig.REDIS_USERNAME, jobs_key='funboost.apscheduler.jobs')
50
+ }
51
+
52
+ funboost_background_scheduler_redis_store = FunboostBackgroundSchedulerProcessJobsWithinRedisLock(timezone=FunboostCommonConfig.TIMEZONE, daemon=False, jobstores=jobstores)
53
+
54
+ """
55
+
56
+ 跨python解释器 跨机器动态修改定时任务配置的例子在
57
+
58
+ test_frame/test_apschedual/test_aps_redis_store.py
59
+ test_frame/test_apschedual/test_change_aps_conf.py
60
+
61
+ """
@@ -361,6 +361,30 @@ class RedisDistributedLockContextManager(LoggerMixin, LoggerLevelSetterMixin):
361
361
  return False
362
362
 
363
363
 
364
+ class RedisDistributedBlockLockContextManager(RedisDistributedLockContextManager):
365
+ def __init__(self, redis_client, redis_lock_key, expire_seconds=30, check_interval=0.1):
366
+ super().__init__(redis_client,redis_lock_key,expire_seconds)
367
+ self.check_interval = check_interval
368
+ # self.logger.setLevel(logging.DEBUG)
369
+
370
+ def __enter__(self):
371
+ while True:
372
+ self._line = sys._getframe().f_back.f_lineno # 调用此方法的代码的函数
373
+ self._file_name = sys._getframe(1).f_code.co_filename # 哪个文件调了用此方法
374
+ ret = self.redis_client.set(self.redis_lock_key, value=self.identifier, ex=self._expire_seconds, nx=True)
375
+ has_aquire_lock = False if ret is None else True
376
+ if has_aquire_lock:
377
+ log_msg = f'\n"{self._file_name}:{self._line}" 这行代码获得了redis锁 {self.redis_lock_key}'
378
+ else:
379
+ log_msg = f'\n"{self._file_name}:{self._line}" 这行代码此次没有获得redis锁 {self.redis_lock_key}'
380
+ # print(self.logger.level,log_msg)
381
+ self.logger.debug(log_msg)
382
+ if has_aquire_lock:
383
+ break
384
+ else:
385
+ time.sleep(self.check_interval)
386
+
387
+
364
388
  """
365
389
  @contextmanager
366
390
  def some_generator(<arguments>):
@@ -372,6 +396,9 @@ class RedisDistributedLockContextManager(LoggerMixin, LoggerLevelSetterMixin):
372
396
  """
373
397
 
374
398
 
399
+
400
+
401
+
375
402
  class ExceptionContextManager:
376
403
  """
377
404
  用上下文管理器捕获异常,可对代码片段进行错误捕捉,比装饰器更细腻
@@ -5,7 +5,7 @@ import datetime
5
5
  import time
6
6
  import re
7
7
  import pytz
8
-
8
+ from funboost.core.funboost_time import FunboostTime
9
9
 
10
10
  from funboost.utils import nb_print
11
11
 
@@ -75,21 +75,22 @@ class DatetimeConverter:
75
75
  """
76
76
  :param datetimex: 接受时间戳 datatime类型 和 时间字符串三种类型
77
77
  """
78
- if isinstance(datetimex, str):
79
- if not re.match(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', datetimex):
80
- raise ValueError('时间字符串的格式不符合此传参的规定')
81
- else:
82
- self.datetime_obj = datetime.datetime.strptime(datetimex, self.DATETIME_FORMATTER)
83
- elif isinstance(datetimex, (int, float)):
84
- if datetimex < 1:
85
- datetimex += 86400
86
- self.datetime_obj = datetime.datetime.fromtimestamp(datetimex, tz=pytz.timezone(_get_funboost_timezone())) # 时间戳0在windows会出错。
87
- elif isinstance(datetimex, datetime.datetime):
88
- self.datetime_obj = datetimex
89
- elif datetimex is None:
90
- self.datetime_obj = datetime.datetime.now(tz=pytz.timezone(_get_funboost_timezone()))
91
- else:
92
- raise ValueError('实例化时候的传参不符合规定')
78
+ # if isinstance(datetimex, str):
79
+ # if not re.match(r'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', datetimex):
80
+ # raise ValueError('时间字符串的格式不符合此传参的规定')
81
+ # else:
82
+ # self.datetime_obj = datetime.datetime.strptime(datetimex, self.DATETIME_FORMATTER)
83
+ # elif isinstance(datetimex, (int, float)):
84
+ # if datetimex < 1:
85
+ # datetimex += 86400
86
+ # self.datetime_obj = datetime.datetime.fromtimestamp(datetimex, tz=pytz.timezone(_get_funboost_timezone())) # 时间戳0在windows会出错。
87
+ # elif isinstance(datetimex, datetime.datetime):
88
+ # self.datetime_obj = datetimex
89
+ # elif datetimex is None:
90
+ # self.datetime_obj = datetime.datetime.now(tz=pytz.timezone(_get_funboost_timezone()))
91
+ # else:
92
+ # raise ValueError('实例化时候的传参不符合规定')
93
+ self.datetime_obj = FunboostTime(datetimex).datetime_obj
93
94
 
94
95
  @property
95
96
  def datetime_str(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 46.7
3
+ Version: 46.9
4
4
  Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
5
5
  Home-page: https://github.com/ydf0509/funboost
6
6
  Author: bfzs
@@ -1,6 +1,6 @@
1
- nb_log>=12.6
1
+ nb_log>=13.2
2
2
  nb_libs>=1.8
3
- nb_time>=1.8
3
+ nb_time>=2.0
4
4
  pymongo==4.3.3
5
5
  AMQPStorm==2.10.6
6
6
  rabbitpy==2.0.1
@@ -77,9 +77,9 @@ setup(
77
77
  'Topic :: Software Development :: Libraries'
78
78
  ],
79
79
  install_requires=[
80
- 'nb_log>=12.6',
80
+ 'nb_log>=13.2',
81
81
  'nb_libs>=1.8',
82
- 'nb_time>=1.8',
82
+ 'nb_time>=2.0',
83
83
  'pymongo==4.3.3', # 3.5.1 -> 4.0.2
84
84
  'AMQPStorm==2.10.6',
85
85
  'rabbitpy==2.0.1',
@@ -1,30 +0,0 @@
1
- from apscheduler.jobstores.redis import RedisJobStore
2
-
3
- from funboost.funboost_config_deafult import BrokerConnConfig,FunboostCommonConfig
4
-
5
- from funboost.timing_job import FunboostBackgroundSchedulerProcessJobsWithinRedisLock
6
-
7
- """
8
- 这个是使用redis作为定时任务持久化,支持动态修改/添加/删除定时任务
9
- """
10
-
11
- jobstores = {
12
- "default": RedisJobStore(db=BrokerConnConfig.REDIS_DB, host=BrokerConnConfig.REDIS_HOST,
13
- port=BrokerConnConfig.REDIS_PORT, password=BrokerConnConfig.REDIS_PASSWORD,
14
- username=BrokerConnConfig.REDIS_USERNAME,jobs_key='funboost.apscheduler.jobs')
15
- }
16
-
17
- funboost_background_scheduler_redis_store = FunboostBackgroundSchedulerProcessJobsWithinRedisLock(timezone=FunboostCommonConfig.TIMEZONE, daemon=False, jobstores=jobstores)
18
-
19
-
20
-
21
-
22
-
23
- """
24
-
25
- 跨python解释器 跨机器动态修改定时任务配置的例子在
26
-
27
- test_frame/test_apschedual/test_aps_redis_store.py
28
- test_frame/test_apschedual/test_change_aps_conf.py
29
-
30
- """
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes