funboost 44.8__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 (292) hide show
  1. {funboost-44.8/funboost.egg-info → funboost-44.9}/PKG-INFO +1 -2
  2. {funboost-44.8 → funboost-44.9}/funboost/__init__.py +1 -1
  3. {funboost-44.8 → funboost-44.9}/funboost/constant.py +14 -4
  4. {funboost-44.8 → funboost-44.9}/funboost/consumers/base_consumer.py +48 -20
  5. {funboost-44.8 → funboost-44.9}/funboost/core/booster.py +15 -0
  6. funboost-44.9/funboost/core/current_task.py +193 -0
  7. {funboost-44.8 → funboost-44.9}/funboost/core/func_params_model.py +8 -0
  8. funboost-44.9/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
  9. {funboost-44.8 → funboost-44.9}/funboost/publishers/base_publisher.py +21 -2
  10. {funboost-44.8 → funboost-44.9}/funboost/set_frame_config.py +2 -1
  11. funboost-44.9/funboost/utils/class_utils.py +101 -0
  12. funboost-44.9/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  13. funboost-44.9/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  14. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +59 -59
  15. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
  16. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
  17. funboost-44.9/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  18. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
  19. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
  20. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
  21. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
  22. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +4804 -4804
  23. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +8 -8
  24. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +1668 -1668
  25. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +96 -96
  26. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +306 -306
  27. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +15 -15
  28. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +329 -329
  29. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +61 -61
  30. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +134 -133
  31. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +16 -16
  32. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
  33. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
  34. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
  35. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
  36. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
  37. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +244 -244
  38. funboost-44.9/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +244 -0
  39. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +98 -98
  40. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +7 -7
  41. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +7 -7
  42. {funboost-44.8 → funboost-44.9}/funboost/utils/times/__init__.py +85 -85
  43. {funboost-44.8 → funboost-44.9}/funboost/utils/times/version.py +1 -1
  44. {funboost-44.8 → funboost-44.9/funboost.egg-info}/PKG-INFO +1 -2
  45. {funboost-44.8 → funboost-44.9}/funboost.egg-info/SOURCES.txt +2 -30
  46. {funboost-44.8 → funboost-44.9}/funboost.egg-info/entry_points.txt +0 -1
  47. funboost-44.8/funboost/core/current_task.py +0 -174
  48. funboost-44.8/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
  49. funboost-44.8/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
  50. funboost-44.8/funboost/utils/class_utils.py +0 -51
  51. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
  52. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
  53. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
  54. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
  55. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
  56. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
  57. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
  58. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
  59. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
  60. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
  61. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
  62. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
  63. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
  64. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
  65. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
  66. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
  67. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
  68. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
  69. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
  70. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
  71. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
  72. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
  73. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
  74. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
  75. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
  76. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
  77. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
  78. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
  79. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
  80. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
  81. funboost-44.8/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
  82. {funboost-44.8 → funboost-44.9}/LICENSE +0 -0
  83. {funboost-44.8 → funboost-44.9}/MANIFEST.in +0 -0
  84. {funboost-44.8 → funboost-44.9}/README.md +0 -0
  85. {funboost-44.8 → funboost-44.9}/funboost/__init__old.py +0 -0
  86. {funboost-44.8 → funboost-44.9}/funboost/__main__.py +0 -0
  87. {funboost-44.8 → funboost-44.9}/funboost/assist/__init__.py +0 -0
  88. {funboost-44.8 → funboost-44.9}/funboost/assist/celery_helper.py +0 -0
  89. {funboost-44.8 → funboost-44.9}/funboost/assist/dramatiq_helper.py +0 -0
  90. {funboost-44.8 → funboost-44.9}/funboost/assist/huey_helper.py +0 -0
  91. {funboost-44.8 → funboost-44.9}/funboost/assist/rocketry_helper.py +0 -0
  92. {funboost-44.8 → funboost-44.9}/funboost/assist/rq_helper.py +0 -0
  93. {funboost-44.8 → funboost-44.9}/funboost/assist/rq_windows_worker.py +0 -0
  94. {funboost-44.8 → funboost-44.9}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
  95. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/__init__.py +0 -0
  96. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/async_helper.py +0 -0
  97. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/async_pool_executor.py +0 -0
  98. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/backup/__init__.py +0 -0
  99. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
  100. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
  101. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
  102. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/base_pool_type.py +0 -0
  103. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
  104. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
  105. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
  106. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
  107. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
  108. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
  109. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
  110. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
  111. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
  112. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
  113. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/pool_commons.py +0 -0
  114. {funboost-44.8 → funboost-44.9}/funboost/concurrent_pool/single_thread_executor.py +0 -0
  115. {funboost-44.8 → funboost-44.9}/funboost/consumers/__init__.py +0 -0
  116. {funboost-44.8 → funboost-44.9}/funboost/consumers/celery_consumer.py +0 -0
  117. {funboost-44.8 → funboost-44.9}/funboost/consumers/confirm_mixin.py +0 -0
  118. {funboost-44.8 → funboost-44.9}/funboost/consumers/dramatiq_consumer.py +0 -0
  119. {funboost-44.8 → funboost-44.9}/funboost/consumers/empty_consumer.py +0 -0
  120. {funboost-44.8 → funboost-44.9}/funboost/consumers/http_consumer.py +0 -0
  121. {funboost-44.8 → funboost-44.9}/funboost/consumers/http_consumer000.py +0 -0
  122. {funboost-44.8 → funboost-44.9}/funboost/consumers/httpsqs_consumer.py +0 -0
  123. {funboost-44.8 → funboost-44.9}/funboost/consumers/huey_consumer.py +0 -0
  124. {funboost-44.8 → funboost-44.9}/funboost/consumers/kafka_consumer.py +0 -0
  125. {funboost-44.8 → funboost-44.9}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
  126. {funboost-44.8 → funboost-44.9}/funboost/consumers/kombu_consumer.py +0 -0
  127. {funboost-44.8 → funboost-44.9}/funboost/consumers/local_python_queue_consumer.py +0 -0
  128. {funboost-44.8 → funboost-44.9}/funboost/consumers/memory_deque_consumer.py +0 -0
  129. {funboost-44.8 → funboost-44.9}/funboost/consumers/mongomq_consumer.py +0 -0
  130. {funboost-44.8 → funboost-44.9}/funboost/consumers/mqtt_consumer.py +0 -0
  131. {funboost-44.8 → funboost-44.9}/funboost/consumers/nameko_consumer.py +0 -0
  132. {funboost-44.8 → funboost-44.9}/funboost/consumers/nats_consumer.py +0 -0
  133. {funboost-44.8 → funboost-44.9}/funboost/consumers/nsq_consumer.py +0 -0
  134. {funboost-44.8 → funboost-44.9}/funboost/consumers/peewee_conusmer.py +0 -0
  135. {funboost-44.8 → funboost-44.9}/funboost/consumers/persist_queue_consumer.py +0 -0
  136. {funboost-44.8 → funboost-44.9}/funboost/consumers/pulsar_consumer.py +0 -0
  137. {funboost-44.8 → funboost-44.9}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
  138. {funboost-44.8 → funboost-44.9}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
  139. {funboost-44.8 → funboost-44.9}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
  140. {funboost-44.8 → funboost-44.9}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
  141. {funboost-44.8 → funboost-44.9}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
  142. {funboost-44.8 → funboost-44.9}/funboost/consumers/redis_consumer.py +0 -0
  143. {funboost-44.8 → funboost-44.9}/funboost/consumers/redis_consumer_ack_able.py +0 -0
  144. {funboost-44.8 → funboost-44.9}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
  145. {funboost-44.8 → funboost-44.9}/funboost/consumers/redis_consumer_priority.py +0 -0
  146. {funboost-44.8 → funboost-44.9}/funboost/consumers/redis_consumer_simple.py +0 -0
  147. {funboost-44.8 → funboost-44.9}/funboost/consumers/redis_filter.py +0 -0
  148. {funboost-44.8 → funboost-44.9}/funboost/consumers/redis_pubsub_consumer.py +0 -0
  149. {funboost-44.8 → funboost-44.9}/funboost/consumers/redis_stream_consumer.py +0 -0
  150. {funboost-44.8 → funboost-44.9}/funboost/consumers/rocketmq_consumer.py +0 -0
  151. {funboost-44.8 → funboost-44.9}/funboost/consumers/rq_consumer.py +0 -0
  152. {funboost-44.8 → funboost-44.9}/funboost/consumers/sqlachemy_consumer.py +0 -0
  153. {funboost-44.8 → funboost-44.9}/funboost/consumers/tcp_consumer.py +0 -0
  154. {funboost-44.8 → funboost-44.9}/funboost/consumers/txt_file_consumer.py +0 -0
  155. {funboost-44.8 → funboost-44.9}/funboost/consumers/udp_consumer.py +0 -0
  156. {funboost-44.8 → funboost-44.9}/funboost/consumers/zeromq_consumer.py +0 -0
  157. {funboost-44.8 → funboost-44.9}/funboost/contrib/__init__.py +0 -0
  158. {funboost-44.8 → funboost-44.9}/funboost/contrib/api_publish_msg.py +0 -0
  159. {funboost-44.8 → funboost-44.9}/funboost/contrib/django_db_deco.py +0 -0
  160. {funboost-44.8 → funboost-44.9}/funboost/contrib/queue2queue.py +0 -0
  161. {funboost-44.8 → funboost-44.9}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
  162. {funboost-44.8 → funboost-44.9}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
  163. {funboost-44.8 → funboost-44.9}/funboost/core/__init__.py +0 -0
  164. {funboost-44.8 → funboost-44.9}/funboost/core/active_cousumer_info_getter.py +0 -0
  165. {funboost-44.8 → funboost-44.9}/funboost/core/cli/__init__.py +0 -0
  166. {funboost-44.8 → funboost-44.9}/funboost/core/cli/discovery_boosters.py +0 -0
  167. {funboost-44.8 → funboost-44.9}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
  168. {funboost-44.8 → funboost-44.9}/funboost/core/cli/funboost_fire.py +0 -0
  169. {funboost-44.8 → funboost-44.9}/funboost/core/exceptions.py +0 -0
  170. {funboost-44.8 → funboost-44.9}/funboost/core/fabric_deploy_helper.py +0 -0
  171. {funboost-44.8 → funboost-44.9}/funboost/core/funboost_config_getter.py +0 -0
  172. {funboost-44.8 → funboost-44.9}/funboost/core/funboost_current_task_context_thread.py +0 -0
  173. {funboost-44.8 → funboost-44.9}/funboost/core/funboost_time.py +0 -0
  174. {funboost-44.8 → funboost-44.9}/funboost/core/function_result_status_config.py +0 -0
  175. {funboost-44.8 → funboost-44.9}/funboost/core/function_result_status_saver.py +0 -0
  176. {funboost-44.8 → funboost-44.9}/funboost/core/helper_funs.py +0 -0
  177. {funboost-44.8 → funboost-44.9}/funboost/core/kill_remote_task.py +0 -0
  178. {funboost-44.8 → funboost-44.9}/funboost/core/lazy_impoter.py +0 -0
  179. {funboost-44.8 → funboost-44.9}/funboost/core/loggers.py +0 -0
  180. {funboost-44.8 → funboost-44.9}/funboost/core/msg_result_getter.py +0 -0
  181. {funboost-44.8 → funboost-44.9}/funboost/core/muliti_process_enhance.py +0 -0
  182. {funboost-44.8 → funboost-44.9}/funboost/core/task_id_logger.py +0 -0
  183. {funboost-44.8 → funboost-44.9}/funboost/factories/__init__.py +0 -0
  184. {funboost-44.8 → funboost-44.9}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
  185. {funboost-44.8 → funboost-44.9}/funboost/factories/consumer_factory.py +0 -0
  186. {funboost-44.8 → funboost-44.9}/funboost/factories/publisher_factotry.py +0 -0
  187. {funboost-44.8 → funboost-44.9}/funboost/funboost_config_deafult.py +0 -0
  188. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/app.py +0 -0
  189. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/functions.py +0 -0
  190. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/assets/css/custom.css +0 -0
  191. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
  192. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
  193. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/assets/js/custom.js +0 -0
  194. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
  195. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/css/style.css +0 -0
  196. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/images/bg.jpg +0 -0
  197. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/images/password.png +0 -0
  198. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/images/tick.png +0 -0
  199. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/images/user.png +0 -0
  200. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
  201. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/templates/index.html +0 -0
  202. {funboost-44.8 → funboost-44.9}/funboost/function_result_web/templates/login.html +0 -0
  203. {funboost-44.8 → funboost-44.9}/funboost/publishers/__init__.py +0 -0
  204. {funboost-44.8 → funboost-44.9}/funboost/publishers/celery_publisher.py +0 -0
  205. {funboost-44.8 → funboost-44.9}/funboost/publishers/celery_publisher000.py +0 -0
  206. {funboost-44.8 → funboost-44.9}/funboost/publishers/confluent_kafka_publisher.py +0 -0
  207. {funboost-44.8 → funboost-44.9}/funboost/publishers/dramatiq_publisher.py +0 -0
  208. {funboost-44.8 → funboost-44.9}/funboost/publishers/empty_publisher.py +0 -0
  209. {funboost-44.8 → funboost-44.9}/funboost/publishers/http_publisher.py +0 -0
  210. {funboost-44.8 → funboost-44.9}/funboost/publishers/httpsqs_publisher.py +0 -0
  211. {funboost-44.8 → funboost-44.9}/funboost/publishers/huey_publisher.py +0 -0
  212. {funboost-44.8 → funboost-44.9}/funboost/publishers/kafka_publisher.py +0 -0
  213. {funboost-44.8 → funboost-44.9}/funboost/publishers/kombu_publisher.py +0 -0
  214. {funboost-44.8 → funboost-44.9}/funboost/publishers/local_python_queue_publisher.py +0 -0
  215. {funboost-44.8 → funboost-44.9}/funboost/publishers/meomory_deque_publisher.py +0 -0
  216. {funboost-44.8 → funboost-44.9}/funboost/publishers/mongomq_publisher.py +0 -0
  217. {funboost-44.8 → funboost-44.9}/funboost/publishers/mqtt_publisher.py +0 -0
  218. {funboost-44.8 → funboost-44.9}/funboost/publishers/nameko_publisher.py +0 -0
  219. {funboost-44.8 → funboost-44.9}/funboost/publishers/nats_publisher.py +0 -0
  220. {funboost-44.8 → funboost-44.9}/funboost/publishers/nsq_publisher.py +0 -0
  221. {funboost-44.8 → funboost-44.9}/funboost/publishers/peewee_publisher.py +0 -0
  222. {funboost-44.8 → funboost-44.9}/funboost/publishers/persist_queue_publisher.py +0 -0
  223. {funboost-44.8 → funboost-44.9}/funboost/publishers/pulsar_publisher.py +0 -0
  224. {funboost-44.8 → funboost-44.9}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
  225. {funboost-44.8 → funboost-44.9}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
  226. {funboost-44.8 → funboost-44.9}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
  227. {funboost-44.8 → funboost-44.9}/funboost/publishers/redis_publisher.py +0 -0
  228. {funboost-44.8 → funboost-44.9}/funboost/publishers/redis_publisher_lpush.py +0 -0
  229. {funboost-44.8 → funboost-44.9}/funboost/publishers/redis_publisher_priority.py +0 -0
  230. {funboost-44.8 → funboost-44.9}/funboost/publishers/redis_publisher_simple.py +0 -0
  231. {funboost-44.8 → funboost-44.9}/funboost/publishers/redis_pubsub_publisher.py +0 -0
  232. {funboost-44.8 → funboost-44.9}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
  233. {funboost-44.8 → funboost-44.9}/funboost/publishers/redis_stream_publisher.py +0 -0
  234. {funboost-44.8 → funboost-44.9}/funboost/publishers/rocketmq_publisher.py +0 -0
  235. {funboost-44.8 → funboost-44.9}/funboost/publishers/rq_publisher.py +0 -0
  236. {funboost-44.8 → funboost-44.9}/funboost/publishers/sqla_queue_publisher.py +0 -0
  237. {funboost-44.8 → funboost-44.9}/funboost/publishers/tcp_publisher.py +0 -0
  238. {funboost-44.8 → funboost-44.9}/funboost/publishers/txt_file_publisher.py +0 -0
  239. {funboost-44.8 → funboost-44.9}/funboost/publishers/udp_publisher.py +0 -0
  240. {funboost-44.8 → funboost-44.9}/funboost/publishers/zeromq_publisher.py +0 -0
  241. {funboost-44.8 → funboost-44.9}/funboost/queues/__init__.py +0 -0
  242. {funboost-44.8 → funboost-44.9}/funboost/queues/peewee_queue.py +0 -0
  243. {funboost-44.8 → funboost-44.9}/funboost/queues/sqla_queue.py +0 -0
  244. {funboost-44.8 → funboost-44.9}/funboost/timing_job/__init__.py +0 -0
  245. {funboost-44.8 → funboost-44.9}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
  246. {funboost-44.8 → funboost-44.9}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
  247. {funboost-44.8 → funboost-44.9}/funboost/utils/__init__.py +0 -0
  248. {funboost-44.8 → funboost-44.9}/funboost/utils/apscheduler_monkey.py +0 -0
  249. {funboost-44.8 → funboost-44.9}/funboost/utils/block_exit.py +0 -0
  250. {funboost-44.8 → funboost-44.9}/funboost/utils/bulk_operation.py +0 -0
  251. {funboost-44.8 → funboost-44.9}/funboost/utils/ctrl_c_end.py +0 -0
  252. {funboost-44.8 → funboost-44.9}/funboost/utils/custom_pysnooper.py +0 -0
  253. {funboost-44.8 → funboost-44.9}/funboost/utils/decorators.py +0 -0
  254. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages/__init__.py +0 -0
  255. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
  256. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
  257. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
  258. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
  259. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
  260. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
  261. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
  262. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
  263. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
  264. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
  265. {funboost-44.8 → funboost-44.9}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
  266. {funboost-44.8 → funboost-44.9}/funboost/utils/develop_log.py +0 -0
  267. {funboost-44.8 → funboost-44.9}/funboost/utils/expire_lock.py +0 -0
  268. {funboost-44.8 → funboost-44.9}/funboost/utils/json_helper.py +0 -0
  269. {funboost-44.8 → funboost-44.9}/funboost/utils/mongo_util.py +0 -0
  270. {funboost-44.8 → funboost-44.9}/funboost/utils/monkey_color_log.py +0 -0
  271. {funboost-44.8 → funboost-44.9}/funboost/utils/monkey_patches.py +0 -0
  272. {funboost-44.8 → funboost-44.9}/funboost/utils/mqtt_util.py +0 -0
  273. {funboost-44.8 → funboost-44.9}/funboost/utils/paramiko_util.py +0 -0
  274. {funboost-44.8 → funboost-44.9}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
  275. {funboost-44.8 → funboost-44.9}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
  276. {funboost-44.8 → funboost-44.9}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
  277. {funboost-44.8 → funboost-44.9}/funboost/utils/pysnooper_ydf/utils.py +0 -0
  278. {funboost-44.8 → funboost-44.9}/funboost/utils/pysnooper_ydf/variables.py +0 -0
  279. {funboost-44.8 → funboost-44.9}/funboost/utils/rabbitmq_factory.py +0 -0
  280. {funboost-44.8 → funboost-44.9}/funboost/utils/redis_manager.py +0 -0
  281. {funboost-44.8 → funboost-44.9}/funboost/utils/redis_manager_old.py +0 -0
  282. {funboost-44.8 → funboost-44.9}/funboost/utils/resource_monitoring.py +0 -0
  283. {funboost-44.8 → funboost-44.9}/funboost/utils/restart_python.py +0 -0
  284. {funboost-44.8 → funboost-44.9}/funboost/utils/simple_data_class.py +0 -0
  285. {funboost-44.8 → funboost-44.9}/funboost/utils/str_utils.py +0 -0
  286. {funboost-44.8 → funboost-44.9}/funboost/utils/time_util.py +0 -0
  287. {funboost-44.8 → funboost-44.9}/funboost/utils/un_strict_json_dumps.py +0 -0
  288. {funboost-44.8 → funboost-44.9}/funboost.egg-info/dependency_links.txt +0 -0
  289. {funboost-44.8 → funboost-44.9}/funboost.egg-info/requires.txt +0 -0
  290. {funboost-44.8 → funboost-44.9}/funboost.egg-info/top_level.txt +0 -0
  291. {funboost-44.8 → funboost-44.9}/setup.cfg +0 -0
  292. {funboost-44.8 → funboost-44.9}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: funboost
3
- Version: 44.8
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
@@ -492,4 +492,3 @@ funboost通过支持celery作为broker_kind,使celer框架变成了funboost的
492
492
  ![](https://visitor-badge.glitch.me/badge?page_id=distributed_framework)
493
493
 
494
494
  <div> </div>
495
-
@@ -13,7 +13,7 @@ set_frame_config这个模块的 use_config_form_funboost_config_module() 是核
13
13
  这段注释说明和使用的用户无关,只和框架开发人员有关.
14
14
  '''
15
15
 
16
- __version__ = "44.8"
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,12 +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
 
568
- async def aio_user_custom_record_process_info_func(self,current_function_result_status:FunctionResultStatus): # 这个可以继承
570
+ async def aio_user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus): # 这个可以继承
569
571
  pass
570
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
+
571
596
  # noinspection PyProtectedMember
572
597
  def _run(self, kw: dict, ):
573
598
  # print(kw)
@@ -627,9 +652,9 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
627
652
  msg = f'{self._unit_time_for_count} 秒内执行了 {self._execute_task_times_every_unit_time} 次函数 [ {self.consuming_function.__name__} ] ,' \
628
653
  f'函数平均运行耗时 {avarage_function_spend_time} 秒。 '
629
654
  self.logger.info(msg)
630
- 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:
631
656
  self._msg_num_in_broker = self.publisher_of_same_queue.get_message_count()
632
- if self._msg_num_in_broker != -1 : # 有的中间件无法统计或没实现统计队列剩余数量的,统一返回的是-1,不显示这句话。
657
+ if self._msg_num_in_broker != -1: # 有的中间件无法统计或没实现统计队列剩余数量的,统一返回的是-1,不显示这句话。
633
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}个剩余的任务'''
634
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) /
635
660
  self._distributed_consumer_statistics.active_consumer_num)
@@ -639,7 +664,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
639
664
  self._current_time_for_execute_task_times_every_unit_time = time.time()
640
665
  self._consuming_function_cost_time_total_every_unit_time = 0
641
666
  self._execute_task_times_every_unit_time = 0
642
- self.user_custom_record_process_info_func(current_function_result_status) # 两种方式都可以自定义,记录结果,建议继承方式,不使用boost中指定 user_custom_record_process_info_func
667
+ self.user_custom_record_process_info_func(current_function_result_status) # 两种方式都可以自定义,记录结果,建议继承方式,不使用boost中指定 user_custom_record_process_info_func
643
668
  if self.consumer_params.user_custom_record_process_info_func:
644
669
  self.consumer_params.user_custom_record_process_info_func(current_function_result_status)
645
670
  except BaseException as e:
@@ -656,17 +681,19 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
656
681
  t_start = time.time()
657
682
  # function_result_status.run_times = current_retry_times + 1
658
683
  fct = funboost_current_task()
659
- fct.function_params = function_only_params
660
- fct.full_msg = kw['body']
661
- fct.function_result_status = function_result_status
662
- 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
+
663
689
  try:
664
690
  function_run = self.consuming_function
665
691
  if self._consuming_function_is_asyncio:
666
- fct._fct_local_data._asyncio_use_thread_concurrent_mode = True
692
+ fct_context.asyncio_use_thread_concurrent_mode = True
667
693
  function_run = sync_or_async_fun_deco(function_run)
668
694
  else:
669
- 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)
670
697
  function_timeout = self._get_priority_conf(kw, 'function_timeout')
671
698
  function_run = function_run if self.consumer_params.consumin_function_decorator is None else self.consumer_params.consumin_function_decorator(function_run)
672
699
  function_run = function_run if not function_timeout else self._concurrent_mode_dispatcher.timeout_deco(
@@ -678,7 +705,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
678
705
  self.logger.warning(f'取消运行 {task_id} {function_only_params}')
679
706
  return function_result_status
680
707
  function_run = kill_remote_task.kill_fun_deco(task_id)(function_run) # 用杀死装饰器包装起来在另一个线程运行函数,以便等待远程杀死。
681
- 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))
682
709
  # if asyncio.iscoroutine(function_result_status.result):
683
710
  # log_msg = f'''异步的协程消费函数必须使用 async 并发模式并发,请设置消费函数 {self.consuming_function.__name__} 的concurrent_mode 为 ConcurrentModeEnum.ASYNC 或 4'''
684
711
  # # self.logger.critical(msg=f'{log_msg} \n')
@@ -828,12 +855,13 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
828
855
  # noinspection PyBroadException
829
856
  t_start = time.time()
830
857
  fct = funboost_current_task()
831
- fct.function_params = function_only_params
832
- fct.full_msg = kw['body']
833
- fct.function_result_status = function_result_status
834
- 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)
835
863
  try:
836
- 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))
837
865
  if not asyncio.iscoroutine(corotinue_obj):
838
866
  log_msg = f'''当前设置的并发模式为 async 并发模式,但消费函数不是异步协程函数,请不要把消费函数 {self.consuming_function.__name__} 的 concurrent_mode 设置错误'''
839
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()
@@ -193,6 +193,10 @@ class BoosterParams(BaseJsonAbleModel):
193
193
  # func_params_is_pydantic_model: bool = False # funboost 兼容支持 函数娼还是 pydantic model类型,funboost在发布之前和取出来时候自己转化。
194
194
 
195
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 #自动生成的信息,不需要用户主动传参.
196
200
 
197
201
  @root_validator(skip_on_failure=True)
198
202
  def check_values(cls, values: dict):
@@ -290,6 +294,10 @@ class PublisherParams(BaseJsonAbleModel):
290
294
  publisher_override_cls: typing.Optional[typing.Type] = None
291
295
  # func_params_is_pydantic_model: bool = False # funboost 兼容支持 函数娼还是 pydantic model类型,funboost在发布之前和取出来时候自己转化。
292
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
+
293
301
 
294
302
  if __name__ == '__main__':
295
303
  from funboost.concurrent_pool import FlexibleThreadPool
@@ -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')
@@ -0,0 +1,101 @@
1
+ import copy
2
+ import gc
3
+ import inspect
4
+ import re
5
+ import sys
6
+ import typing
7
+
8
+ import nb_log
9
+ from types import MethodType, FunctionType
10
+
11
+ from funboost.constant import FunctionKind
12
+
13
+
14
+ class ClsHelper:
15
+ @staticmethod
16
+ def get_instncae_method_cls(instncae_method):
17
+ print(instncae_method)
18
+ print(instncae_method.__qualname__)
19
+ print(instncae_method.__module__)
20
+ return getattr(sys.modules[instncae_method.__module__],instncae_method.__qualname__.split('.')[0])
21
+ # return instncae_method.__self__.__class__
22
+
23
+ @staticmethod
24
+ def get_classs_method_cls(class_method):
25
+ print(class_method)
26
+ print(class_method.__qualname__)
27
+ print(class_method.__module__)
28
+ return getattr(sys.modules[class_method.__module__],class_method.__qualname__.split('.')[0])
29
+
30
+ @staticmethod
31
+ def is_class_method(method):
32
+ # if inspect.ismethod(method):
33
+ # if hasattr(method, '__self__') and inspect.isclass(method.__self__):
34
+ # return True
35
+ # return False
36
+
37
+ sourcelines = inspect.getsourcelines(method)
38
+ # print(sourcelines)
39
+ line0: str = sourcelines[0][0]
40
+ if line0.replace(' ', '').startswith('@classmethod'):
41
+ return True
42
+
43
+ @staticmethod
44
+ def is_static_method(method):
45
+ sourcelines = inspect.getsourcelines(method)
46
+ line0: str = sourcelines[0][0]
47
+ if line0.replace(' ', '').startswith('@staticmethod'):
48
+ return True
49
+
50
+ @classmethod
51
+ def is_instance_method(cls, method):
52
+ if cls.is_class_method(method):
53
+ return False
54
+ if cls.is_static_method(method):
55
+ return False
56
+ if isinstance(method, FunctionType):
57
+ sourcelines = inspect.getsourcelines(method)
58
+ for line in sourcelines[0][:50]:
59
+ if not line.replace( ' ','').startswith('#'):
60
+ if not line.startswith('def') and re.search('\(\s*?self\s*?,',line):
61
+ return True
62
+ # method_class = getattr(method, '__qualname__', '').rsplit('.', 1)[0]
63
+ # if method_class: # 如果能找到类名,说明是类的成员
64
+ # print( f"{method.__name__} 属于类 {method_class} 的成员")
65
+ #
66
+ # return True
67
+
68
+ @classmethod
69
+ def is_common_function(cls, method):
70
+ if cls.is_static_method(method):
71
+ return False
72
+ if cls.is_class_method(method):
73
+ return False
74
+ if cls.is_instance_method(method):
75
+ return False
76
+ if isinstance(method, FunctionType):
77
+ sourcelines = inspect.getsourcelines(method)
78
+ for line in sourcelines[0][:50]:
79
+ if not line.replace(' ', '').startswith('#'):
80
+ if not re.search('\(\s*?self\s*?,', line):
81
+ return True
82
+
83
+ @classmethod
84
+ def get_method_kind(cls, method: typing.Callable) -> str:
85
+ if cls.is_class_method(method):
86
+ return FunctionKind.CLASS_METHOD
87
+ elif cls.is_static_method(method):
88
+ return FunctionKind.STATIC_METHOD
89
+ elif cls.is_instance_method(method):
90
+ return FunctionKind.INSTANCE_METHOD
91
+ elif cls.is_common_function(method):
92
+ return FunctionKind.COMMON_FUNCTION
93
+
94
+ @staticmethod
95
+ def get_obj_init_params_for_funboost(obj_init_params: dict):
96
+ obj_init_params.pop('self')
97
+ return copy.deepcopy(obj_init_params)
98
+
99
+
100
+ if __name__ == '__main__':
101
+ pass