funboost 42.3__tar.gz → 42.6__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.
- {funboost-42.3/funboost.egg-info → funboost-42.6}/PKG-INFO +1 -1
- {funboost-42.3 → funboost-42.6}/funboost/__init__.py +1 -1
- {funboost-42.3 → funboost-42.6}/funboost/consumers/base_consumer.py +12 -11
- {funboost-42.3 → funboost-42.6}/funboost/core/booster.py +66 -2
- {funboost-42.3 → funboost-42.6}/funboost/core/cli/discovery_boosters.py +18 -5
- {funboost-42.3 → funboost-42.6}/funboost/core/cli/funboost_cli_user_templ.py +3 -5
- {funboost-42.3 → funboost-42.6}/funboost/core/cli/funboost_fire.py +26 -32
- {funboost-42.3 → funboost-42.6}/funboost/core/function_result_status_saver.py +11 -4
- funboost-42.6/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/app.py +2 -2
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/functions.py +9 -4
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/templates/index.html +26 -7
- {funboost-42.3 → funboost-42.6}/funboost/publishers/base_publisher.py +7 -0
- {funboost-42.3 → funboost-42.6/funboost.egg-info}/PKG-INFO +1 -1
- funboost-42.3/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/LICENSE +0 -0
- {funboost-42.3 → funboost-42.6}/MANIFEST.in +0 -0
- {funboost-42.3 → funboost-42.6}/README.md +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/__init__old.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/__main__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/assist/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/assist/celery_helper.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/assist/dramatiq_helper.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/assist/huey_helper.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/assist/rocketry_helper.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/assist/rq_helper.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/assist/rq_windows_worker.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/async_helper.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/async_pool_executor.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/backup/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/base_pool_type.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/pool_commons.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/single_thread_executor.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/constant.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/celery_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/confirm_mixin.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/dramatiq_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/http_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/http_consumer000.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/httpsqs_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/huey_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/kafka_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/kombu_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/local_python_queue_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/memory_deque_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/mongomq_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/mqtt_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/nameko_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/nats_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/nsq_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/peewee_conusmer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/persist_queue_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/pulsar_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/redis_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/redis_consumer_ack_able.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/redis_consumer_priority.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/redis_consumer_simple.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/redis_filter.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/redis_pubsub_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/redis_stream_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/rocketmq_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/rq_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/sqlachemy_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/tcp_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/txt_file_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/udp_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/consumers/zeromq_consumer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/contrib/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/contrib/api_publish_msg.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/contrib/django_db_deco.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/contrib/queue2queue.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/active_cousumer_info_getter.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/cli/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/exceptions.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/fabric_deploy_helper.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/func_params_model.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/function_result_status_config.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/helper_funs.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/kill_remote_task.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/loggers.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/msg_result_getter.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/muliti_process_enhance.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/core/try_get_user_funboost_common_config.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/factories/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/factories/consumer_factory.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/factories/publisher_factotry.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/funboost_config_deafult.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/assets/css/custom.css +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/assets/js/custom.js +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/css/style.css +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/images/bg.jpg +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/images/password.png +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/images/tick.png +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/images/user.png +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/function_result_web/templates/login.html +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/celery_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/celery_publisher000.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/confluent_kafka_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/dramatiq_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/http_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/httpsqs_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/huey_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/kafka_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/kombu_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/local_python_queue_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/meomory_deque_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/mongomq_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/mqtt_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/nameko_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/nats_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/nsq_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/peewee_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/persist_queue_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/pulsar_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/redis_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/redis_publisher_lpush.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/redis_publisher_priority.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/redis_publisher_simple.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/redis_pubsub_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/redis_stream_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/rocketmq_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/rq_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/sqla_queue_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/tcp_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/txt_file_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/udp_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/publishers/zeromq_publisher.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/queues/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/queues/peewee_queue.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/queues/sqla_queue.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/set_frame_config.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/timing_job/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/apscheduler_monkey.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/block_exit.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/bulk_operation.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/ctrl_c_end.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/custom_pysnooper.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/decorators.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/develop_log.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/expire_lock.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/json_helper.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/mongo_util.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/monkey_color_log.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/monkey_patches.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/mqtt_util.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/paramiko_util.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/pysnooper_ydf/utils.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/pysnooper_ydf/variables.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/rabbitmq_factory.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/redis_manager.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/redis_manager_old.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/resource_monitoring.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/restart_python.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/simple_data_class.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/time_util.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/times/__init__.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/times/version.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost/utils/un_strict_json_dumps.py +0 -0
- {funboost-42.3 → funboost-42.6}/funboost.egg-info/SOURCES.txt +0 -0
- {funboost-42.3 → funboost-42.6}/funboost.egg-info/dependency_links.txt +0 -0
- {funboost-42.3 → funboost-42.6}/funboost.egg-info/entry_points.txt +0 -0
- {funboost-42.3 → funboost-42.6}/funboost.egg-info/requires.txt +0 -0
- {funboost-42.3 → funboost-42.6}/funboost.egg-info/top_level.txt +0 -0
- {funboost-42.3 → funboost-42.6}/setup.cfg +0 -0
- {funboost-42.3 → funboost-42.6}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version: 42.
|
|
3
|
+
Version: 42.6
|
|
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
|
|
@@ -44,7 +44,7 @@ from apscheduler.executors.pool import ThreadPoolExecutor as ApschedulerThreadPo
|
|
|
44
44
|
from funboost.funboost_config_deafult import FunboostCommonConfig
|
|
45
45
|
from funboost.concurrent_pool.single_thread_executor import SoloExecutor
|
|
46
46
|
|
|
47
|
-
from funboost.core.function_result_status_saver import ResultPersistenceHelper, FunctionResultStatus
|
|
47
|
+
from funboost.core.function_result_status_saver import ResultPersistenceHelper, FunctionResultStatus, RunStatus
|
|
48
48
|
|
|
49
49
|
from funboost.core.helper_funs import delete_keys_and_return_new_dict, get_publish_time
|
|
50
50
|
|
|
@@ -524,10 +524,11 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
524
524
|
current_retry_times = 0
|
|
525
525
|
function_only_params = delete_keys_and_return_new_dict(kw['body'])
|
|
526
526
|
for current_retry_times in range(max_retry_times + 1):
|
|
527
|
+
current_function_result_status.run_times = current_retry_times + 1
|
|
528
|
+
current_function_result_status.run_status = RunStatus.running
|
|
529
|
+
self._result_persistence_helper.save_function_result_to_mongo(current_function_result_status)
|
|
527
530
|
current_function_result_status = self._run_consuming_function_with_confirm_and_retry(kw, current_retry_times=current_retry_times,
|
|
528
|
-
function_result_status=
|
|
529
|
-
self.queue_name, self.consuming_function.__name__,
|
|
530
|
-
kw['body']))
|
|
531
|
+
function_result_status=current_function_result_status)
|
|
531
532
|
if (current_function_result_status.success is True or current_retry_times == max_retry_times
|
|
532
533
|
or current_function_result_status._has_requeue
|
|
533
534
|
or current_function_result_status._has_to_dlx_queue
|
|
@@ -538,7 +539,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
538
539
|
time.sleep(self.consumer_params.retry_interval)
|
|
539
540
|
if not (current_function_result_status._has_requeue and self.BROKER_KIND in [BrokerEnum.RABBITMQ_AMQPSTORM, BrokerEnum.RABBITMQ_PIKA, BrokerEnum.RABBITMQ_RABBITPY]): # 已经nack了,不能ack,否则rabbitmq delevar tag 报错
|
|
540
541
|
self._confirm_consume(kw)
|
|
541
|
-
|
|
542
|
+
current_function_result_status.run_status = RunStatus.finish
|
|
542
543
|
self._result_persistence_helper.save_function_result_to_mongo(current_function_result_status)
|
|
543
544
|
if self._get_priority_conf(kw, 'do_task_filtering'):
|
|
544
545
|
self._redis_filter.add_a_value(function_only_params) # 函数执行成功后,添加函数的参数排序后的键值对字符串到set中。
|
|
@@ -597,7 +598,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
597
598
|
function_only_params = delete_keys_and_return_new_dict(kw['body']) if self._do_not_delete_extra_from_msg is False else kw['body']
|
|
598
599
|
task_id = kw['body']['extra']['task_id']
|
|
599
600
|
t_start = time.time()
|
|
600
|
-
function_result_status.run_times = current_retry_times + 1
|
|
601
|
+
# function_result_status.run_times = current_retry_times + 1
|
|
601
602
|
try:
|
|
602
603
|
function_run = self.consuming_function
|
|
603
604
|
if self._consuming_function_is_asyncio:
|
|
@@ -679,20 +680,20 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
679
680
|
current_retry_times = 0
|
|
680
681
|
function_only_params = delete_keys_and_return_new_dict(kw['body'])
|
|
681
682
|
for current_retry_times in range(max_retry_times + 1):
|
|
683
|
+
current_function_result_status.run_times = current_retry_times + 1
|
|
684
|
+
current_function_result_status.run_status = RunStatus.running
|
|
685
|
+
self._result_persistence_helper.save_function_result_to_mongo(current_function_result_status)
|
|
682
686
|
current_function_result_status = await self._async_run_consuming_function_with_confirm_and_retry(kw, current_retry_times=current_retry_times,
|
|
683
|
-
function_result_status=
|
|
684
|
-
self.queue_name, self.consuming_function.__name__,
|
|
685
|
-
kw['body'], ),
|
|
686
|
-
)
|
|
687
|
+
function_result_status=current_function_result_status )
|
|
687
688
|
if current_function_result_status.success is True or current_retry_times == max_retry_times or current_function_result_status._has_requeue:
|
|
688
689
|
break
|
|
689
690
|
else:
|
|
690
691
|
if self.consumer_params.retry_interval:
|
|
691
692
|
await asyncio.sleep(self.consumer_params.retry_interval)
|
|
692
693
|
|
|
693
|
-
# self._result_persistence_helper.save_function_result_to_mongo(function_result_status)
|
|
694
694
|
if not (current_function_result_status._has_requeue and self.BROKER_KIND in [BrokerEnum.RABBITMQ_AMQPSTORM, BrokerEnum.RABBITMQ_PIKA, BrokerEnum.RABBITMQ_RABBITPY]):
|
|
695
695
|
await simple_run_in_executor(self._confirm_consume, kw)
|
|
696
|
+
current_function_result_status.run_status = RunStatus.finish
|
|
696
697
|
await simple_run_in_executor(self._result_persistence_helper.save_function_result_to_mongo, current_function_result_status)
|
|
697
698
|
if self._get_priority_conf(kw, 'do_task_filtering'):
|
|
698
699
|
# self._redis_filter.add_a_value(function_only_params) # 函数执行成功后,添加函数的参数排序后的键值对字符串到set中。
|
|
@@ -4,7 +4,8 @@ import os
|
|
|
4
4
|
import types
|
|
5
5
|
import typing
|
|
6
6
|
|
|
7
|
-
from funboost.
|
|
7
|
+
from funboost.utils.ctrl_c_end import ctrl_c_recv
|
|
8
|
+
from funboost.core.loggers import flogger, develop_logger, logger_prompt
|
|
8
9
|
|
|
9
10
|
from functools import wraps
|
|
10
11
|
|
|
@@ -12,9 +13,11 @@ from funboost.core.exceptions import BoostDecoParamsIsOldVersion
|
|
|
12
13
|
from funboost.core.func_params_model import BoosterParams, FunctionResultStatusPersistanceConfig, PriorityConsumingControlConfig
|
|
13
14
|
|
|
14
15
|
from funboost.factories.consumer_factory import get_consumer
|
|
16
|
+
|
|
15
17
|
if typing.TYPE_CHECKING:
|
|
16
18
|
from funboost.core.msg_result_getter import AsyncResult
|
|
17
19
|
|
|
20
|
+
|
|
18
21
|
class Booster:
|
|
19
22
|
"""
|
|
20
23
|
funboost极其重视代码能在pycharm下自动补全。元编程经常造成在pycharm下代码无法自动补全提示,主要是实现代码补全难。
|
|
@@ -117,7 +120,7 @@ class Booster:
|
|
|
117
120
|
priority_control_config: PriorityConsumingControlConfig = None) -> AsyncResult:
|
|
118
121
|
""" 多进程安全的,在fork多进程(非spawn多进程)情况下,很多包跨线程/进程不能共享中间件连接,"""
|
|
119
122
|
consumer = BoostersManager.get_or_create_booster_by_queue_name(self.queue_name).consumer
|
|
120
|
-
return
|
|
123
|
+
return consumer.publisher_of_same_queue.publish(msg=msg, task_id=task_id, priority_control_config=priority_control_config)
|
|
121
124
|
|
|
122
125
|
# noinspection PyMethodMayBeStatic
|
|
123
126
|
def multi_process_consume(self, process_num=1):
|
|
@@ -250,3 +253,64 @@ class BoostersManager:
|
|
|
250
253
|
flogger.info(f'创建booster {boost_params} {boost_params.consuming_function}')
|
|
251
254
|
booster = Booster(boost_params)(boost_params.consuming_function)
|
|
252
255
|
return booster
|
|
256
|
+
|
|
257
|
+
@classmethod
|
|
258
|
+
def push(cls, queue_name, *args, **kwargs):
|
|
259
|
+
"""push发布消息到消息队列 ;
|
|
260
|
+
"""
|
|
261
|
+
cls.get_or_create_booster_by_queue_name(queue_name).push(*args, **kwargs)
|
|
262
|
+
|
|
263
|
+
@classmethod
|
|
264
|
+
def publish(cls, queue_name, msg):
|
|
265
|
+
"""publish发布消息到消息队列;
|
|
266
|
+
"""
|
|
267
|
+
cls.get_or_create_booster_by_queue_name(queue_name).publish(msg)
|
|
268
|
+
|
|
269
|
+
@classmethod
|
|
270
|
+
def consume_queues(cls, *queue_names):
|
|
271
|
+
"""
|
|
272
|
+
启动多个消息队列名的消费,多个函数队列在当前同一个进程内启动消费.
|
|
273
|
+
这种方式节约总的内存,但无法利用多核cpu
|
|
274
|
+
"""
|
|
275
|
+
for queue_name in queue_names:
|
|
276
|
+
cls.get_booster(queue_name).consume()
|
|
277
|
+
ctrl_c_recv()
|
|
278
|
+
|
|
279
|
+
consume = consume_queues
|
|
280
|
+
|
|
281
|
+
@classmethod
|
|
282
|
+
def consume_all_queues(cls):
|
|
283
|
+
"""
|
|
284
|
+
启动所有消息队列名的消费,无需一个一个函数亲自 funxx.consume()来启动,多个函数队列在当前同一个进程内启动消费.
|
|
285
|
+
这种方式节约总的内存,但无法利用多核cpu
|
|
286
|
+
"""
|
|
287
|
+
for queue_name in cls.get_all_queues():
|
|
288
|
+
cls.get_booster(queue_name).consume()
|
|
289
|
+
ctrl_c_recv()
|
|
290
|
+
|
|
291
|
+
consume_all = consume_all_queues
|
|
292
|
+
|
|
293
|
+
@classmethod
|
|
294
|
+
def multi_process_consume_queues(cls, **queue_name__process_num):
|
|
295
|
+
"""
|
|
296
|
+
启动多个消息队列名的消费,传递队列名和进程数,每个队列启动n个单独的消费进程;
|
|
297
|
+
这种方式总的内存使用高,但充分利用多核cpu
|
|
298
|
+
例如 multi_process_consume_queues(queue1=2,queue2=3) 表示启动2个进程消费queue1,启动3个进程消费queue2
|
|
299
|
+
"""
|
|
300
|
+
for queue_name, process_num in queue_name__process_num.items():
|
|
301
|
+
cls.get_booster(queue_name).multi_process_consume(process_num)
|
|
302
|
+
ctrl_c_recv()
|
|
303
|
+
|
|
304
|
+
m_consume = multi_process_consume_queues
|
|
305
|
+
|
|
306
|
+
@classmethod
|
|
307
|
+
def multi_process_consume_all_queues(cls, process_num=1):
|
|
308
|
+
"""
|
|
309
|
+
启动所有消息队列名的消费,无需指定队列名,每个队列启动n个单独的消费进程;
|
|
310
|
+
这种方式总的内存使用高,但充分利用多核cpu
|
|
311
|
+
"""
|
|
312
|
+
for queue_name in cls.get_all_queues():
|
|
313
|
+
cls.get_booster(queue_name).multi_process_consume(process_num)
|
|
314
|
+
ctrl_c_recv()
|
|
315
|
+
|
|
316
|
+
m_consume_all = multi_process_consume_all_queues
|
|
@@ -6,7 +6,10 @@ from pathlib import Path
|
|
|
6
6
|
import importlib.util
|
|
7
7
|
# import nb_log
|
|
8
8
|
from funboost.core.loggers import FunboostFileLoggerMixin
|
|
9
|
+
from funboost.utils.decorators import flyweight
|
|
9
10
|
|
|
11
|
+
|
|
12
|
+
@flyweight
|
|
10
13
|
class BoosterDiscovery(FunboostFileLoggerMixin):
|
|
11
14
|
def __init__(self, project_root_path: typing.Union[PathLike, str],
|
|
12
15
|
booster_dirs: typing.List[typing.Union[PathLike, str]],
|
|
@@ -23,6 +26,7 @@ class BoosterDiscovery(FunboostFileLoggerMixin):
|
|
|
23
26
|
self.py_file_re_str = py_file_re_str
|
|
24
27
|
|
|
25
28
|
self.py_files = []
|
|
29
|
+
self._has_discovery_import = False
|
|
26
30
|
|
|
27
31
|
def get_py_files_recursively(self, current_folder_path: Path, current_depth=0, ):
|
|
28
32
|
"""先找到所有py文件"""
|
|
@@ -34,15 +38,20 @@ class BoosterDiscovery(FunboostFileLoggerMixin):
|
|
|
34
38
|
elif item.suffix == '.py':
|
|
35
39
|
if self.py_file_re_str:
|
|
36
40
|
if re.search(self.py_file_re_str, str(item), ):
|
|
37
|
-
self.py_files.append(item)
|
|
41
|
+
self.py_files.append(str(item))
|
|
38
42
|
else:
|
|
39
|
-
self.py_files.append(item)
|
|
43
|
+
self.py_files.append(str(item))
|
|
40
44
|
self.py_files = list(set(self.py_files))
|
|
41
|
-
for f in self.py_files:
|
|
42
|
-
self.logger.debug(f)
|
|
43
45
|
|
|
44
46
|
def auto_discovery(self, ):
|
|
45
|
-
"""把所有py文件自动执行import,主要是把 所有的@boost函数装饰器注册到 pid_queue_name__booster_map 中
|
|
47
|
+
"""把所有py文件自动执行import,主要是把 所有的@boost函数装饰器注册到 pid_queue_name__booster_map 中
|
|
48
|
+
这个auto_discovery方法最好放到main里面,如果要扫描自身文件夹,没写正则排除文件本身,会无限懵逼死循环导入,无无限懵逼死循环导入
|
|
49
|
+
"""
|
|
50
|
+
if self._has_discovery_import is False:
|
|
51
|
+
self._has_discovery_import = True
|
|
52
|
+
else:
|
|
53
|
+
pass
|
|
54
|
+
return # 这一个判断是避免用户执行BoosterDiscovery.auto_discovery没有放到 if __name__ == '__main__'中,导致无限懵逼死循环.
|
|
46
55
|
self.logger.info(self.booster__full_path_dirs)
|
|
47
56
|
for dir in self.booster__full_path_dirs:
|
|
48
57
|
if not Path(dir).exists():
|
|
@@ -50,6 +59,10 @@ class BoosterDiscovery(FunboostFileLoggerMixin):
|
|
|
50
59
|
|
|
51
60
|
self.get_py_files_recursively(Path(dir))
|
|
52
61
|
for file_path in self.py_files:
|
|
62
|
+
self.logger.debug(f'导入模块 {file_path}')
|
|
63
|
+
if Path(file_path) == Path(sys._getframe(1).f_code.co_filename):
|
|
64
|
+
self.logger.warning(f'排除导入调用auto_discovery的模块自身 {file_path}') # 否则下面的import这个文件,会造成无限懵逼死循环
|
|
65
|
+
continue
|
|
53
66
|
spec = importlib.util.spec_from_file_location('module', file_path)
|
|
54
67
|
module = importlib.util.module_from_spec(spec)
|
|
55
68
|
spec.loader.exec_module(module)
|
|
@@ -30,12 +30,10 @@ from funboost.core.cli.discovery_boosters import BoosterDiscovery
|
|
|
30
30
|
'''
|
|
31
31
|
env_dict['project_root_path'] = project_root_path
|
|
32
32
|
|
|
33
|
-
# booster_dirs 用户可以自己增加扫描的文件夹,这样可以命令行少传了 --booster_dirs_str
|
|
34
|
-
# BoosterDiscovery 可以多吃调用
|
|
35
|
-
BoosterDiscovery(project_root_path, booster_dirs=[], max_depth=1,py_file_re_str=None).auto_discovery()
|
|
36
|
-
|
|
37
|
-
|
|
38
33
|
if __name__ == '__main__':
|
|
34
|
+
# booster_dirs 用户可以自己增加扫描的文件夹,这样可以命令行少传了 --booster_dirs_str
|
|
35
|
+
# BoosterDiscovery 可以多次调用
|
|
36
|
+
BoosterDiscovery(project_root_path, booster_dirs=[], max_depth=1, py_file_re_str=None).auto_discovery() # 这个最好放到main里面,如果要扫描自身文件夹,没写正则排除文件本身,会无限懵逼死循环导入
|
|
39
37
|
fire.Fire(BoosterFire, )
|
|
40
38
|
|
|
41
39
|
'''
|
|
@@ -49,87 +49,81 @@ class BoosterFire(object):
|
|
|
49
49
|
清空多个queue ; 例子: clear test_cli1_queue1 test_cli1_queue2 # 清空2个消息队列消息队列
|
|
50
50
|
"""
|
|
51
51
|
|
|
52
|
-
for
|
|
53
|
-
BoostersManager.get_booster(
|
|
52
|
+
for queue_name in queue_names:
|
|
53
|
+
BoostersManager.get_booster(queue_name).clear()
|
|
54
54
|
return self
|
|
55
55
|
|
|
56
|
-
def push(self,
|
|
56
|
+
def push(self, queue_name, *args, **kwargs):
|
|
57
57
|
"""push发布消息到消息队列 ;
|
|
58
58
|
例子: 假设函数是 def add(x,y) 队列名是 add_queue , 发布 1 + 2求和;
|
|
59
59
|
push add_queue 1 2;
|
|
60
60
|
或者 push add_queue --x=1 --y=2;
|
|
61
61
|
或者 push add_queue -x 1 -y 2;
|
|
62
62
|
"""
|
|
63
|
-
BoostersManager.
|
|
63
|
+
BoostersManager.push(queue_name,*args, **kwargs)
|
|
64
64
|
return self
|
|
65
65
|
|
|
66
66
|
def __str__(self):
|
|
67
67
|
# print('over') # 这行重要,否则命令行链式调用无法自动结束
|
|
68
68
|
return ''
|
|
69
69
|
|
|
70
|
-
def publish(self,
|
|
70
|
+
def publish(self, queue_name, msg):
|
|
71
71
|
"""publish发布消息到消息队列;
|
|
72
72
|
假设函数是 def add(x,y) 队列名是 add_queue , 发布 1 + 2求和;
|
|
73
73
|
publish add_queue "{'x':1,'y':2}"
|
|
74
74
|
"""
|
|
75
75
|
|
|
76
|
-
BoostersManager.
|
|
76
|
+
BoostersManager.publish(queue_name,msg)
|
|
77
77
|
return self
|
|
78
78
|
|
|
79
|
-
def
|
|
79
|
+
def consume_queues(self, *queue_names: str):
|
|
80
80
|
"""
|
|
81
81
|
启动多个消息队列名的消费;
|
|
82
82
|
例子: consume queue1 queue2
|
|
83
83
|
"""
|
|
84
|
-
|
|
85
|
-
BoostersManager.get_booster(queue_anme).consume()
|
|
86
|
-
ctrl_c_recv()
|
|
84
|
+
BoostersManager.consume_queues(*queue_names)
|
|
87
85
|
|
|
88
|
-
|
|
86
|
+
consume = consume_queues
|
|
87
|
+
|
|
88
|
+
def consume_all_queues(self, ):
|
|
89
89
|
"""
|
|
90
90
|
启动所有消息队列名的消费,无需指定队列名;
|
|
91
91
|
例子: consume_all_queues
|
|
92
92
|
"""
|
|
93
|
-
|
|
94
|
-
BoostersManager.get_booster(queue_anme).consume()
|
|
95
|
-
ctrl_c_recv()
|
|
93
|
+
BoostersManager.consume_all_queues()
|
|
96
94
|
|
|
97
95
|
consume_all = consume_all_queues
|
|
98
96
|
|
|
99
|
-
def
|
|
97
|
+
def multi_process_consume_queues(self, **queue_name__process_num):
|
|
100
98
|
"""
|
|
101
|
-
|
|
102
|
-
例子:
|
|
99
|
+
使用多进程启动消费,每个队列开启多个单独的进程消费;
|
|
100
|
+
例子: m_consume --queue1=2 --queue2=3 # queue1启动两个单独进程消费 queue2 启动3个单独进程消费
|
|
103
101
|
"""
|
|
104
|
-
|
|
105
|
-
BoostersManager.get_booster(queue_anme).multi_process_consume(process_num)
|
|
106
|
-
ctrl_c_recv()
|
|
102
|
+
BoostersManager.multi_process_consume_queues(**queue_name__process_num)
|
|
107
103
|
|
|
108
|
-
|
|
104
|
+
m_consume = multi_process_consume_queues
|
|
109
105
|
|
|
110
|
-
def
|
|
106
|
+
def multi_process_consume_all_queues(self, process_num=1):
|
|
111
107
|
"""
|
|
112
|
-
|
|
113
|
-
例子:
|
|
108
|
+
启动所有消息队列名的消费,无需指定队列名,每个队列启动n个单独的消费进程;
|
|
109
|
+
例子: multi_process_consume_all_queues 2
|
|
114
110
|
"""
|
|
115
|
-
|
|
116
|
-
BoostersManager.get_booster(queue_anme).multi_process_consume(process_num)
|
|
117
|
-
ctrl_c_recv()
|
|
111
|
+
BoostersManager.multi_process_consume_all_queues(process_num)
|
|
118
112
|
|
|
119
|
-
|
|
113
|
+
m_consume_all = multi_process_consume_all_queues
|
|
120
114
|
|
|
121
115
|
def pause(self, *queue_names: str):
|
|
122
116
|
"""
|
|
123
117
|
暂停多个消息队列名的消费;
|
|
124
118
|
例子: pause queue1 queue2
|
|
125
119
|
"""
|
|
126
|
-
for
|
|
127
|
-
BoostersManager.get_booster(
|
|
120
|
+
for queue_name in queue_names:
|
|
121
|
+
BoostersManager.get_booster(queue_name).pause()
|
|
128
122
|
|
|
129
123
|
def continue_consume(self, *queue_names: str):
|
|
130
124
|
"""
|
|
131
125
|
继续多个消息队列名的消费;
|
|
132
126
|
例子: continue_consume queue1 queue2
|
|
133
127
|
"""
|
|
134
|
-
for
|
|
135
|
-
BoostersManager.get_booster(
|
|
128
|
+
for queue_name in queue_names:
|
|
129
|
+
BoostersManager.get_booster(queue_name).continue_consume()
|
|
@@ -20,6 +20,9 @@ from funboost.utils.mongo_util import MongoMixin
|
|
|
20
20
|
# from nb_log import LoggerMixin
|
|
21
21
|
from funboost.core.loggers import FunboostFileLoggerMixin
|
|
22
22
|
|
|
23
|
+
class RunStatus:
|
|
24
|
+
running = 'running'
|
|
25
|
+
finish = 'finish'
|
|
23
26
|
|
|
24
27
|
class FunctionResultStatus():
|
|
25
28
|
host_name = socket.gethostname()
|
|
@@ -51,6 +54,7 @@ class FunctionResultStatus():
|
|
|
51
54
|
self.time_cost = None
|
|
52
55
|
self.time_end = None
|
|
53
56
|
self.success = False
|
|
57
|
+
self.run_status = ''
|
|
54
58
|
self.total_thread = threading.active_count()
|
|
55
59
|
self._has_requeue = False
|
|
56
60
|
self._has_to_dlx_queue = False
|
|
@@ -59,11 +63,14 @@ class FunctionResultStatus():
|
|
|
59
63
|
|
|
60
64
|
def get_status_dict(self, without_datetime_obj=False):
|
|
61
65
|
self.time_end = time.time()
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
if self.run_status == RunStatus.running:
|
|
67
|
+
self.time_cost = None
|
|
68
|
+
else:
|
|
69
|
+
self.time_cost = round(self.time_end - self.time_start, 3)
|
|
70
|
+
item = {}
|
|
71
|
+
for k, v in self.__dict__.items():
|
|
65
72
|
if not k.startswith('_'):
|
|
66
|
-
item[k] =v
|
|
73
|
+
item[k] = v
|
|
67
74
|
item['host_name'] = self.host_name
|
|
68
75
|
item['host_process'] = self.host_process
|
|
69
76
|
item['script_name'] = self.script_name
|
|
@@ -119,7 +119,7 @@ def query_cols_view():
|
|
|
119
119
|
@app.route('/query_result')
|
|
120
120
|
@login_required
|
|
121
121
|
def query_result_view():
|
|
122
|
-
|
|
122
|
+
|
|
123
123
|
return jsonify(query_result(**request.values.to_dict()))
|
|
124
124
|
|
|
125
125
|
|
|
@@ -142,7 +142,7 @@ if __name__ == '__main__':
|
|
|
142
142
|
# with app.test_request_context():
|
|
143
143
|
# print(url_for('query_cols_view'))
|
|
144
144
|
|
|
145
|
-
app.run(debug=False, threaded=True, host='0.0.0.0', port=
|
|
145
|
+
app.run(debug=False, threaded=True, host='0.0.0.0', port=27019)
|
|
146
146
|
|
|
147
147
|
'''
|
|
148
148
|
linux 是export , win是 set
|
|
@@ -6,7 +6,7 @@ import json
|
|
|
6
6
|
from pprint import pprint
|
|
7
7
|
import time
|
|
8
8
|
from flask import jsonify
|
|
9
|
-
|
|
9
|
+
import copy
|
|
10
10
|
from funboost import nb_print
|
|
11
11
|
from funboost.utils import time_util, decorators, LoggerMixin
|
|
12
12
|
from funboost.utils.mongo_util import MongoMixin
|
|
@@ -36,6 +36,10 @@ def get_cols(col_name_search: str):
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
def query_result(col_name, start_time, end_time, is_success, function_params: str, page, ):
|
|
39
|
+
query_kw = copy.copy(locals())
|
|
40
|
+
t0 = time.time()
|
|
41
|
+
if not col_name:
|
|
42
|
+
return []
|
|
39
43
|
db = MongoMixin().mongo_db_task_status
|
|
40
44
|
condition = {
|
|
41
45
|
'insert_time': {'$gt': time_util.DatetimeConverter(start_time).datetime_obj,
|
|
@@ -56,7 +60,8 @@ def query_result(col_name, start_time, end_time, is_success, function_params: st
|
|
|
56
60
|
# results = list(db.get_collection(col_name).find(condition, ).sort([('insert_time', -1)]).skip(int(page) * 100).limit(100))
|
|
57
61
|
# with decorators.TimerContextManager():
|
|
58
62
|
results = list(db.get_collection(col_name).find(condition, {'insert_time': 0, 'utime': 0}).skip(int(page) * 100).limit(100))
|
|
59
|
-
# nb_print(
|
|
63
|
+
# nb_print(results)
|
|
64
|
+
nb_print(time.time() -t0, query_kw)
|
|
60
65
|
return results
|
|
61
66
|
|
|
62
67
|
|
|
@@ -73,8 +78,8 @@ def get_speed(col_name, start_time, end_time):
|
|
|
73
78
|
with decorators.TimerContextManager():
|
|
74
79
|
# success_num = db.get_collection(col_name).count({**{'success': True}, **condition})
|
|
75
80
|
# fail_num = db.get_collection(col_name).count({**{'success': False}, **condition})
|
|
76
|
-
success_num = db.get_collection(col_name).count_documents({**{'success': True}, **condition})
|
|
77
|
-
fail_num = db.get_collection(col_name).count_documents({**{'success': False}, **condition})
|
|
81
|
+
success_num = db.get_collection(col_name).count_documents({**{'success': True,'run_status':'finish'}, **condition})
|
|
82
|
+
fail_num = db.get_collection(col_name).count_documents({**{'success': False,'run_status':'finish'}, **condition})
|
|
78
83
|
qps = (success_num + fail_num) / (time_util.DatetimeConverter(end_time).timestamp - time_util.DatetimeConverter(start_time).timestamp)
|
|
79
84
|
return {'success_num': success_num, 'fail_num': fail_num, 'qps': round(qps, 1)}
|
|
80
85
|
|
|
@@ -123,7 +123,8 @@
|
|
|
123
123
|
|
|
124
124
|
|
|
125
125
|
</main><!-- page-content" --></div><!-- page-wrapper -->
|
|
126
|
-
|
|
126
|
+
<!--<script src="{{ url_for('static',filename='js/jquery-1.11.0.min.js') }}" type="text/javascript"></script>-->
|
|
127
|
+
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
|
|
127
128
|
<script src="http://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
|
128
129
|
|
|
129
130
|
|
|
@@ -163,6 +164,7 @@
|
|
|
163
164
|
return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
|
|
164
165
|
}
|
|
165
166
|
|
|
167
|
+
|
|
166
168
|
//昨天的时间
|
|
167
169
|
var day1 = new Date();
|
|
168
170
|
day1.setDate(day1.getDate() - 2);
|
|
@@ -220,16 +222,19 @@
|
|
|
220
222
|
var html = ' <thead>\n' +
|
|
221
223
|
' <tr>\n' +
|
|
222
224
|
' <th>执行机器-进程-脚本</th>\n' +
|
|
223
|
-
|
|
225
|
+
|
|
224
226
|
' <th>函数名称</th>\n' +
|
|
225
227
|
' <th>函数入参</th>\n' +
|
|
226
228
|
' <th>函数结果</th>\n' +
|
|
227
|
-
' <th
|
|
228
|
-
' <th
|
|
229
|
+
' <th>消息发布时间</th>\n' +
|
|
230
|
+
' <th>开始执行时间</th>\n' +
|
|
231
|
+
' <th>消耗时间(秒)</th>\n' +
|
|
232
|
+
' <th>执行次数(重试)</th>\n' +
|
|
233
|
+
' <th>运行状态</th>\n' +
|
|
229
234
|
' <th>是否成功</th>\n' +
|
|
230
235
|
' <th>错误原因</th>\n' +
|
|
231
236
|
|
|
232
|
-
|
|
237
|
+
|
|
233
238
|
' <th>线程(协程)数</th>\n' +
|
|
234
239
|
' </tr>\n' +
|
|
235
240
|
' </thead>' +
|
|
@@ -257,11 +262,25 @@
|
|
|
257
262
|
' <td>{9}</td>\n' +
|
|
258
263
|
' <td>{10}</td>\n' +
|
|
259
264
|
' <td>{11}</td>\n' +
|
|
265
|
+
' <td>{12}</td>\n' +
|
|
260
266
|
|
|
261
267
|
' </tr>';
|
|
262
268
|
var successText = item.success === true ? "成功" : "失败";
|
|
263
|
-
|
|
264
|
-
|
|
269
|
+
<!-- console.info(item.run_status);-->
|
|
270
|
+
var run_status_text = item.run_status;
|
|
271
|
+
if (item.run_status==="running"){
|
|
272
|
+
successText = "未完成";
|
|
273
|
+
displayLevel = "info";
|
|
274
|
+
if ( Date.now() /1000 - item.time_start > 600) {
|
|
275
|
+
run_status_text = "running?";
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
var time_start_obj = new Date(item.time_start * 1000);
|
|
280
|
+
var time_start_str = dateToString(time_start_obj);
|
|
281
|
+
|
|
282
|
+
tr = tr.format(displayLevel, item.host_process + ' - ' + item.script_name, item.function, item.params_str, item.result,item.publish_time_str,
|
|
283
|
+
time_start_str,item.time_cost, item.run_times, run_status_text,successText, item.exception, item.total_thread);
|
|
265
284
|
html += tr;
|
|
266
285
|
}
|
|
267
286
|
html += '</tbody>';
|
|
@@ -223,6 +223,13 @@ class AbstractPublisher(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
223
223
|
self._init_count()
|
|
224
224
|
return AsyncResult(task_id)
|
|
225
225
|
|
|
226
|
+
def send_msg(self,msg:typing.Union[dict,str]):
|
|
227
|
+
"""直接发送任意消息内容到消息队列,不生成辅助参数,无视函数入参名字,不校验入参个数和键名"""
|
|
228
|
+
if isinstance(msg,dict):
|
|
229
|
+
msg = json.dumps(msg, ensure_ascii=False)
|
|
230
|
+
decorators.handle_exception(retry_times=10, is_throw_error=True, time_sleep=0.1)(
|
|
231
|
+
self.concrete_realization_of_publish)(msg)
|
|
232
|
+
|
|
226
233
|
def push(self, *func_args, **func_kwargs):
|
|
227
234
|
"""
|
|
228
235
|
简写,只支持传递消费函数的本身参数,不支持priority_control_config参数。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version: 42.
|
|
3
|
+
Version: 42.6
|
|
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
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-42.3 → funboost-42.6}/funboost/beggar_version_implementation/beggar_redis_consumer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/backup/async_pool_executor_janus.py
RENAMED
|
File without changes
|
|
File without changes
|
{funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-42.3 → funboost-42.6}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|