funboost 46.0__tar.gz → 46.1__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-46.0/funboost.egg-info → funboost-46.1}/PKG-INFO +5 -2
- {funboost-46.0 → funboost-46.1}/README.md +3 -0
- {funboost-46.0 → funboost-46.1}/funboost/__init__.py +1 -1
- {funboost-46.0 → funboost-46.1}/funboost/assist/celery_helper.py +16 -3
- {funboost-46.0 → funboost-46.1}/funboost/consumers/base_consumer.py +21 -10
- {funboost-46.0 → funboost-46.1}/funboost/consumers/celery_consumer.py +1 -1
- {funboost-46.0 → funboost-46.1}/funboost/consumers/confirm_mixin.py +3 -3
- {funboost-46.0 → funboost-46.1}/funboost/consumers/redis_brpoplpush_consumer.py +1 -1
- {funboost-46.0 → funboost-46.1}/funboost/consumers/redis_consumer_ack_using_timeout.py +1 -1
- {funboost-46.0 → funboost-46.1}/funboost/consumers/redis_stream_consumer.py +1 -1
- {funboost-46.0 → funboost-46.1}/funboost/core/booster.py +3 -2
- {funboost-46.0 → funboost-46.1}/funboost/core/funboost_config_getter.py +1 -1
- {funboost-46.0 → funboost-46.1}/funboost/core/helper_funs.py +1 -1
- {funboost-46.0 → funboost-46.1/funboost.egg-info}/PKG-INFO +5 -2
- {funboost-46.0 → funboost-46.1}/setup.py +1 -1
- {funboost-46.0 → funboost-46.1}/LICENSE +0 -0
- {funboost-46.0 → funboost-46.1}/MANIFEST.in +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/__init__old.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/__main__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/assist/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/assist/dramatiq_helper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/assist/faststream_helper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/assist/huey_helper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/assist/rocketry_helper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/assist/rq_helper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/assist/rq_windows_worker.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/assist/taskiq_helper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/async_helper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/async_pool_executor.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/backup/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/base_pool_type.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/pool_commons.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/single_thread_executor.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/constant.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/dramatiq_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/empty_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/faststream_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/http_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/http_consumer000.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/httpsqs_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/huey_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/kafka_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/kombu_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/local_python_queue_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/memory_deque_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/mongomq_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/mqtt_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/nameko_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/nats_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/nsq_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/peewee_conusmer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/persist_queue_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/pulsar_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/redis_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/redis_consumer_ack_able.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/redis_consumer_priority.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/redis_consumer_simple.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/redis_filter.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/redis_pubsub_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/rocketmq_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/rq_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/sqlachemy_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/tcp_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/txt_file_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/udp_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/consumers/zeromq_consumer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/contrib/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/contrib/api_publish_msg.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/contrib/django_db_deco.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/contrib/queue2queue.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/active_cousumer_info_getter.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/cli/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/cli/discovery_boosters.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/cli/funboost_fire.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/current_task.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/exceptions.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/fabric_deploy_helper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/funboost_time.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/func_params_model.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/function_result_status_config.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/function_result_status_saver.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/kill_remote_task.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/lazy_impoter.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/loggers.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/msg_result_getter.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/muliti_process_enhance.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/serialization.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/core/task_id_logger.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/factories/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/factories/consumer_factory.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/factories/publisher_factotry.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/funboost_config_deafult.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/app.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/functions.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/assets/css/custom.css +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/assets/js/custom.js +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/css/style.css +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/images/bg.jpg +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/images/password.png +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/images/tick.png +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/images/user.png +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/templates/index.html +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/function_result_web/templates/login.html +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/base_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/celery_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/celery_publisher000.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/confluent_kafka_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/dramatiq_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/empty_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/faststream_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/http_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/httpsqs_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/huey_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/kafka_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/kombu_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/local_python_queue_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/meomory_deque_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/mongomq_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/mqtt_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/nameko_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/nats_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/nsq_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/peewee_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/persist_queue_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/pulsar_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/redis_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/redis_publisher_lpush.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/redis_publisher_priority.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/redis_publisher_simple.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/redis_pubsub_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/redis_stream_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/rocketmq_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/rq_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/sqla_queue_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/tcp_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/txt_file_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/udp_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/publishers/zeromq_publisher.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/queues/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/queues/memory_queues_map.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/queues/peewee_queue.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/queues/sqla_queue.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/set_frame_config.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/timing_job/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/apscheduler_monkey.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/block_exit.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/bulk_operation.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/class_utils.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/ctrl_c_end.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/custom_pysnooper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/decorators.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/develop_log.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/expire_lock.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/json_helper.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/mongo_util.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/monkey_color_log.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/monkey_patches.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/mqtt_util.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/paramiko_util.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/pysnooper_ydf/utils.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/pysnooper_ydf/variables.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/rabbitmq_factory.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/redis_manager.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/redis_manager_old.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/resource_monitoring.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/restart_python.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/simple_data_class.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/str_utils.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/time_util.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/times/__init__.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/times/version.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost/utils/un_strict_json_dumps.py +0 -0
- {funboost-46.0 → funboost-46.1}/funboost.egg-info/SOURCES.txt +0 -0
- {funboost-46.0 → funboost-46.1}/funboost.egg-info/dependency_links.txt +0 -0
- {funboost-46.0 → funboost-46.1}/funboost.egg-info/entry_points.txt +0 -0
- {funboost-46.0 → funboost-46.1}/funboost.egg-info/requires.txt +0 -0
- {funboost-46.0 → funboost-46.1}/funboost.egg-info/top_level.txt +0 -0
- {funboost-46.0 → funboost-46.1}/setup.cfg +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version: 46.
|
|
4
|
-
Summary: pip install funboost,python
|
|
3
|
+
Version: 46.1
|
|
4
|
+
Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
|
|
5
5
|
Home-page: https://github.com/ydf0509/funboost
|
|
6
6
|
Author: bfzs
|
|
7
7
|
Author-email: ydf0509@sohu.com
|
|
@@ -49,6 +49,8 @@ License-File: LICENSE
|
|
|
49
49
|
<pre style="color: greenyellow;background-color: #0c1119; font-size: medium;">
|
|
50
50
|
pip install funboost ,python全功能分布式函数调度框架。 demo用法例子见文档1.3
|
|
51
51
|
|
|
52
|
+
funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。
|
|
53
|
+
|
|
52
54
|
只需要一行@boost代码即可分布式执行python一切任意函数,99%用过funboost的pythoner 感受是 方便 快速 强大。
|
|
53
55
|
支持python所有类型的并发模式,消息队列方面支持全球一切知名消息队列中间件和模拟的实现消息队列,
|
|
54
56
|
同时funboost支持celery整个框架作为核心来发布和消费消息,使用funboost的极简api方式来自动化配置和利用celery调度,
|
|
@@ -101,6 +103,7 @@ funboost的旧框架名字是function_scheduling_distributed_framework , 关系
|
|
|
101
103
|
[查看分布式函数调度框架文档 https://funboost.readthedocs.io/zh-cn/latest/index.html](https://funboost.readthedocs.io/zh-cn/latest/index.html)
|
|
102
104
|
|
|
103
105
|
|
|
106
|
+
|
|
104
107
|
[funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
|
|
105
108
|
|
|
106
109
|
```
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
<pre style="color: greenyellow;background-color: #0c1119; font-size: medium;">
|
|
18
18
|
pip install funboost ,python全功能分布式函数调度框架。 demo用法例子见文档1.3
|
|
19
19
|
|
|
20
|
+
funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。
|
|
21
|
+
|
|
20
22
|
只需要一行@boost代码即可分布式执行python一切任意函数,99%用过funboost的pythoner 感受是 方便 快速 强大。
|
|
21
23
|
支持python所有类型的并发模式,消息队列方面支持全球一切知名消息队列中间件和模拟的实现消息队列,
|
|
22
24
|
同时funboost支持celery整个框架作为核心来发布和消费消息,使用funboost的极简api方式来自动化配置和利用celery调度,
|
|
@@ -69,6 +71,7 @@ funboost的旧框架名字是function_scheduling_distributed_framework , 关系
|
|
|
69
71
|
[查看分布式函数调度框架文档 https://funboost.readthedocs.io/zh-cn/latest/index.html](https://funboost.readthedocs.io/zh-cn/latest/index.html)
|
|
70
72
|
|
|
71
73
|
|
|
74
|
+
|
|
72
75
|
[funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
|
|
73
76
|
|
|
74
77
|
```
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
|
|
1
3
|
import json
|
|
2
4
|
import logging
|
|
3
5
|
import os
|
|
@@ -79,10 +81,18 @@ class CeleryHelper:
|
|
|
79
81
|
cls.to_be_start_work_celery_queue_name_set.add(queue_name)
|
|
80
82
|
|
|
81
83
|
@classmethod
|
|
82
|
-
def realy_start_celery_worker(cls, worker_name=None, loglevel='INFO'):
|
|
83
|
-
|
|
84
|
+
def realy_start_celery_worker(cls, worker_name=None, loglevel='INFO',worker_concurrency=200,start_consume_queue_name_list:list=None,is_start_consume_all_queues:bool=False):
|
|
85
|
+
|
|
86
|
+
if is_start_consume_all_queues is False:
|
|
87
|
+
to_be_start_work_celery_queue_name_set_new = copy.copy(cls.to_be_start_work_celery_queue_name_set)
|
|
88
|
+
to_be_start_work_celery_queue_name_set_new.update(set(start_consume_queue_name_list))
|
|
89
|
+
else:
|
|
90
|
+
from funboost import BoostersManager
|
|
91
|
+
# print(BoostersManager.get_all_queues())
|
|
92
|
+
to_be_start_work_celery_queue_name_set_new = set(BoostersManager.get_all_queues())
|
|
93
|
+
queue_names_str = ','.join(list(to_be_start_work_celery_queue_name_set_new))
|
|
94
|
+
if not to_be_start_work_celery_queue_name_set_new:
|
|
84
95
|
raise Exception('celery worker 没有需要运行的queue')
|
|
85
|
-
queue_names_str = ','.join(list(cls.to_be_start_work_celery_queue_name_set))
|
|
86
96
|
# '--concurrency=200',
|
|
87
97
|
# '--autoscale=5,500' threads 并发模式不支持自动扩大缩小并发数量,
|
|
88
98
|
worker_name = worker_name or f'pid_{os.getpid()}'
|
|
@@ -97,7 +107,10 @@ class CeleryHelper:
|
|
|
97
107
|
# 'worker_redirect_stdouts': False,
|
|
98
108
|
'worker_concurrency': 200
|
|
99
109
|
}
|
|
110
|
+
或
|
|
111
|
+
CeleryHelper.update_celery_app_conf({ 'worker_concurrency': 500})
|
|
100
112
|
'''
|
|
113
|
+
cls.update_celery_app_conf({'worker_concurrency':worker_concurrency})
|
|
101
114
|
argv = ['worker', f'--pool={pool_name}',
|
|
102
115
|
'-n', f'worker_funboost_{worker_name}@%h', f'--loglevel={loglevel}',
|
|
103
116
|
f'--queues={queue_names_str}', # 并发数量是 在app配置中已经制定了。自己用 update_celery_app_conf 方法更新就好了。
|
|
@@ -120,6 +120,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
120
120
|
"""
|
|
121
121
|
# ConsumersManager.join_all_consumer_shedual_task_thread()
|
|
122
122
|
if GlobalVars.has_start_a_consumer_flag:
|
|
123
|
+
# self.keep_circulating(10,block=True,)(time.sleep)()
|
|
123
124
|
while 1:
|
|
124
125
|
time.sleep(10)
|
|
125
126
|
|
|
@@ -287,12 +288,13 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
287
288
|
pass
|
|
288
289
|
|
|
289
290
|
def keep_circulating(self, time_sleep=0.001, exit_if_function_run_sucsess=False, is_display_detail_exception=True,
|
|
290
|
-
block=True):
|
|
291
|
+
block=True, daemon=False):
|
|
291
292
|
"""间隔一段时间,一直循环运行某个方法的装饰器
|
|
292
293
|
:param time_sleep :循环的间隔时间
|
|
293
294
|
:param is_display_detail_exception
|
|
294
295
|
:param exit_if_function_run_sucsess :如果成功了就退出循环
|
|
295
296
|
:param block:是否阻塞在当前主线程运行。
|
|
297
|
+
:param daemon:是否守护线程
|
|
296
298
|
"""
|
|
297
299
|
|
|
298
300
|
def _keep_circulating(func):
|
|
@@ -316,11 +318,12 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
316
318
|
self.logger.error(msg=log_msg, exc_info=True)
|
|
317
319
|
finally:
|
|
318
320
|
time.sleep(time_sleep)
|
|
321
|
+
# print(func,time_sleep)
|
|
319
322
|
|
|
320
323
|
if block:
|
|
321
324
|
return ___keep_circulating()
|
|
322
325
|
else:
|
|
323
|
-
threading.Thread(target=___keep_circulating, ).start()
|
|
326
|
+
threading.Thread(target=___keep_circulating, daemon=daemon).start()
|
|
324
327
|
|
|
325
328
|
return __keep_circulating
|
|
326
329
|
|
|
@@ -351,14 +354,14 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
351
354
|
self._distributed_consumer_statistics.run()
|
|
352
355
|
self.logger.warning(f'启动了分布式环境 使用 redis 的键 hearbeat:{self._queue_name} 统计活跃消费者 ,当前消费者唯一标识为 {self.consumer_identification}')
|
|
353
356
|
|
|
354
|
-
self.keep_circulating(60, block=False)(self.check_heartbeat_and_message_count)() # 间隔时间最好比self._unit_time_for_count小整数倍,不然日志不准。
|
|
357
|
+
self.keep_circulating(60, block=False, daemon=False)(self.check_heartbeat_and_message_count)() # 间隔时间最好比self._unit_time_for_count小整数倍,不然日志不准。
|
|
355
358
|
if self.consumer_params.is_support_remote_kill_task:
|
|
356
359
|
kill_remote_task.RemoteTaskKiller(self.queue_name, None).start_cycle_kill_task()
|
|
357
360
|
self.consumer_params.is_show_message_get_from_broker = True # 方便用户看到从消息队列取出来的消息的task_id,然后使用task_id杀死运行中的消息。
|
|
358
361
|
if self.consumer_params.do_task_filtering:
|
|
359
362
|
self._redis_filter.delete_expire_filter_task_cycle() # 这个默认是RedisFilter类,是个pass不运行。所以用别的消息中间件模式,不需要安装和配置redis。
|
|
360
363
|
if self.consumer_params.schedule_tasks_on_main_thread:
|
|
361
|
-
self.keep_circulating(1)(self._shedual_task)()
|
|
364
|
+
self.keep_circulating(1, daemon=False)(self._shedual_task)()
|
|
362
365
|
else:
|
|
363
366
|
self._concurrent_mode_dispatcher.schedulal_task_with_no_block()
|
|
364
367
|
|
|
@@ -1108,7 +1111,7 @@ class ConcurrentModeDispatcher(FunboostFileLoggerMixin):
|
|
|
1108
1111
|
# ConsumersManager.schedulal_thread_to_be_join.append(g)
|
|
1109
1112
|
|
|
1110
1113
|
def schedulal_task_with_no_block(self):
|
|
1111
|
-
self.consumer.keep_circulating(1, block=False)(self.consumer._shedual_task)()
|
|
1114
|
+
self.consumer.keep_circulating(1, block=False, daemon=False)(self.consumer._shedual_task)()
|
|
1112
1115
|
|
|
1113
1116
|
|
|
1114
1117
|
def wait_for_possible_has_finish_all_tasks_by_conusmer_list(consumer_list: typing.List[AbstractConsumer], minutes: int = 3):
|
|
@@ -1139,6 +1142,13 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
|
|
|
1139
1142
|
|
|
1140
1143
|
3、从redis中获取停止和暂停状态,以便支持在别的地方发送命令停止或者暂停消费。
|
|
1141
1144
|
"""
|
|
1145
|
+
SHOW_CONSUMER_NUM_INTERVAL = 600
|
|
1146
|
+
HEARBEAT_EXPIRE_SECOND = 25
|
|
1147
|
+
SEND_HEARTBEAT_INTERVAL = 10
|
|
1148
|
+
|
|
1149
|
+
if HEARBEAT_EXPIRE_SECOND < SEND_HEARTBEAT_INTERVAL * 2:
|
|
1150
|
+
raise ValueError(f'HEARBEAT_EXPIRE_SECOND:{HEARBEAT_EXPIRE_SECOND} , SEND_HEARTBEAT_INTERVAL:{SEND_HEARTBEAT_INTERVAL} ')
|
|
1151
|
+
|
|
1142
1152
|
|
|
1143
1153
|
def __init__(self, consumer: AbstractConsumer):
|
|
1144
1154
|
# self._consumer_identification = consumer_identification
|
|
@@ -1157,8 +1167,7 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
|
|
|
1157
1167
|
|
|
1158
1168
|
def run(self):
|
|
1159
1169
|
self.send_heartbeat()
|
|
1160
|
-
self._consumer.keep_circulating(
|
|
1161
|
-
# decorators.keep_circulating(5, block=False)(self._show_active_consumer_num)() # 主要是为快速频繁统计分布式消费者个数,快速调整分布式qps控频率。
|
|
1170
|
+
self._consumer.keep_circulating(self.SEND_HEARTBEAT_INTERVAL, block=False, daemon=False)(self.send_heartbeat)()
|
|
1162
1171
|
|
|
1163
1172
|
def _send_heartbeat_with_dict_value(self, redis_key, ):
|
|
1164
1173
|
# 发送当前消费者进程心跳的,值是字典,按一个机器或者一个队列运行了哪些进程。
|
|
@@ -1167,7 +1176,7 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
|
|
|
1167
1176
|
with self.redis_db_frame.pipeline() as p:
|
|
1168
1177
|
for result in results:
|
|
1169
1178
|
result_dict = Serialization.to_dict(result)
|
|
1170
|
-
if self.timestamp() - result_dict['hearbeat_timestamp'] >
|
|
1179
|
+
if self.timestamp() - result_dict['hearbeat_timestamp'] > self.HEARBEAT_EXPIRE_SECOND \
|
|
1171
1180
|
or self._consumer_identification_map['consumer_uuid'] == result_dict['consumer_uuid']:
|
|
1172
1181
|
# 因为这个是10秒钟运行一次,15秒还没更新,那肯定是掉线了。如果消费者本身是自己也先删除。
|
|
1173
1182
|
p.srem(redis_key, result)
|
|
@@ -1179,10 +1188,11 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
|
|
|
1179
1188
|
|
|
1180
1189
|
def send_heartbeat(self):
|
|
1181
1190
|
# 根据队列名心跳的,值是字符串,方便值作为其他redis的键名
|
|
1191
|
+
|
|
1182
1192
|
results = self.redis_db_frame.smembers(self._redis_key_name)
|
|
1183
1193
|
with self.redis_db_frame.pipeline() as p:
|
|
1184
1194
|
for result in results:
|
|
1185
|
-
if self.timestamp() - float(result.split('&&')[-1]) >
|
|
1195
|
+
if self.timestamp() - float(result.split('&&')[-1]) > self.HEARBEAT_EXPIRE_SECOND or \
|
|
1186
1196
|
self._consumer_identification == result.split('&&')[0]: # 因为这个是10秒钟运行一次,15秒还没更新,那肯定是掉线了。如果消费者本身是自己也先删除。
|
|
1187
1197
|
p.srem(self._redis_key_name, result)
|
|
1188
1198
|
p.sadd(self._redis_key_name, f'{self._consumer_identification}&&{self.timestamp()}')
|
|
@@ -1193,9 +1203,10 @@ class DistributedConsumerStatistics(RedisMixin, FunboostFileLoggerMixin):
|
|
|
1193
1203
|
self._show_active_consumer_num()
|
|
1194
1204
|
self._get_stop_and_pause_flag_from_redis()
|
|
1195
1205
|
|
|
1206
|
+
|
|
1196
1207
|
def _show_active_consumer_num(self):
|
|
1197
1208
|
self.active_consumer_num = self.redis_db_frame.scard(self._redis_key_name) or 1
|
|
1198
|
-
if time.time() - self._last_show_consumer_num_timestamp >
|
|
1209
|
+
if time.time() - self._last_show_consumer_num_timestamp > self.SHOW_CONSUMER_NUM_INTERVAL:
|
|
1199
1210
|
self.logger.info(f'分布式所有环境中使用 {self._queue_name} 队列的,一共有 {self.active_consumer_num} 个消费者')
|
|
1200
1211
|
self._last_show_consumer_num_timestamp = time.time()
|
|
1201
1212
|
|
|
@@ -180,7 +180,7 @@ class CeleryConsumer(AbstractConsumer):
|
|
|
180
180
|
log_msg = f'fun: {self.consuming_function} args: {args} , kwargs: {kwargs} 消息达到最大重试次数{this.request.retries}次仍然出错, {exc} \n'
|
|
181
181
|
self.logger.critical(log_msg, exc_info=self.consumer_params.is_print_detail_exception)
|
|
182
182
|
# 发生异常,尝试重试任务,countdown 是多少秒后重试
|
|
183
|
-
raise this.retry(exc=exc, countdown=
|
|
183
|
+
raise this.retry(exc=exc, countdown=self.consumer_params.retry_interval)
|
|
184
184
|
|
|
185
185
|
celery_app.conf.task_routes.update({self.queue_name: {"queue": self.queue_name}}) # 自动配置celery每个函数使用不同的队列名。
|
|
186
186
|
self.celery_task = f
|
|
@@ -27,7 +27,7 @@ class ConsumerConfirmMixinWithTheHelpOfRedis(RedisMixin):
|
|
|
27
27
|
self._unack_zset_name = f'{self._queue_name}__unack'
|
|
28
28
|
|
|
29
29
|
def start_consuming_message(self):
|
|
30
|
-
self.
|
|
30
|
+
self.consumer_params.is_send_consumer_hearbeat_to_redis = True
|
|
31
31
|
super().start_consuming_message()
|
|
32
32
|
self.keep_circulating(60, block=False)(self._requeue_tasks_which_unconfirmed)()
|
|
33
33
|
|
|
@@ -62,14 +62,14 @@ class ConsumerConfirmMixinWithTheHelpOfRedisByHearbeat(ConsumerConfirmMixinWithT
|
|
|
62
62
|
# noinspection PyAttributeOutsideInit
|
|
63
63
|
def custom_init(self):
|
|
64
64
|
self._unack_zset_name = f'{self._queue_name}__unack_id_{self.consumer_identification}'
|
|
65
|
-
self.
|
|
65
|
+
self.consumer_params.is_send_consumer_hearbeat_to_redis = True
|
|
66
66
|
self._last_show_unacked_msg_num_log = 0
|
|
67
67
|
|
|
68
68
|
def _requeue_tasks_which_unconfirmed(self):
|
|
69
69
|
lock_key = f'fsdf_lock__requeue_tasks_which_unconfirmed:{self._queue_name}'
|
|
70
70
|
with decorators.RedisDistributedLockContextManager(self.redis_db_frame, lock_key, ).set_log_level(30) as lock:
|
|
71
71
|
if lock.has_aquire_lock:
|
|
72
|
-
self._distributed_consumer_statistics.send_heartbeat()
|
|
72
|
+
# self._distributed_consumer_statistics.send_heartbeat() # 已经周期运行了。
|
|
73
73
|
current_queue_hearbeat_ids = self._distributed_consumer_statistics.get_queue_heartbeat_ids(without_time=True)
|
|
74
74
|
current_queue_unacked_msg_queues = self.redis_db_frame.scan(0, f'{self._queue_name}__unack_id_*', count=self.SCAN_COUNT) # 不要在funboost的队列所在db放弃他缓存keys,要保持db的keys少于1000,否则要多次scan。
|
|
75
75
|
# print(current_queue_unacked_msg_queues)
|
|
@@ -17,7 +17,7 @@ class RedisBrpopLpushConsumer(AbstractConsumer, RedisMixin):
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def start_consuming_message(self):
|
|
20
|
-
self.
|
|
20
|
+
self.consumer_params.is_send_consumer_hearbeat_to_redis = True
|
|
21
21
|
super().start_consuming_message()
|
|
22
22
|
self.keep_circulating(60, block=False)(self._requeue_tasks_which_unconfirmed)()
|
|
23
23
|
|
|
@@ -29,7 +29,7 @@ class RedisConsumerAckUsingTimeout(AbstractConsumer, RedisMixin):
|
|
|
29
29
|
self._last_show_unack_ts = time.time()
|
|
30
30
|
|
|
31
31
|
def start_consuming_message(self):
|
|
32
|
-
self.
|
|
32
|
+
self.consumer_params.is_send_consumer_hearbeat_to_redis = True
|
|
33
33
|
super().start_consuming_message()
|
|
34
34
|
self.keep_circulating(10, block=False)(self._requeue_tasks_which_unconfirmed)()
|
|
35
35
|
|
|
@@ -28,7 +28,7 @@ class RedisStreamConsumer(AbstractConsumer, RedisMixin):
|
|
|
28
28
|
if self.redis_db_frame.type(self._queue_name) == 'list':
|
|
29
29
|
raise EnvironmentError(f'检测到已存在 {self._queue_name} 这个键,且类型是list, 必须换个队列名字或者删除这个 list 类型的键。'
|
|
30
30
|
f'RedisStreamConsumer 使用的是 stream 数据结构')
|
|
31
|
-
self.
|
|
31
|
+
self.consumer_params.is_send_consumer_hearbeat_to_redis = True
|
|
32
32
|
super().start_consuming_message()
|
|
33
33
|
self.keep_circulating(60, block=False)(self._requeue_tasks_which_unconfirmed)()
|
|
34
34
|
|
|
@@ -315,14 +315,15 @@ class BoostersManager:
|
|
|
315
315
|
consume = consume_queues
|
|
316
316
|
|
|
317
317
|
@classmethod
|
|
318
|
-
def consume_all_queues(cls):
|
|
318
|
+
def consume_all_queues(cls,block=True):
|
|
319
319
|
"""
|
|
320
320
|
启动所有消息队列名的消费,无需一个一个函数亲自 funxx.consume()来启动,多个函数队列在当前同一个进程内启动消费.
|
|
321
321
|
这种方式节约总的内存,但无法利用多核cpu
|
|
322
322
|
"""
|
|
323
323
|
for queue_name in cls.get_all_queues():
|
|
324
324
|
cls.get_booster(queue_name).consume()
|
|
325
|
-
|
|
325
|
+
if block:
|
|
326
|
+
ctrl_c_recv()
|
|
326
327
|
|
|
327
328
|
consume_all = consume_all_queues
|
|
328
329
|
|
|
@@ -3,5 +3,5 @@ def _try_get_user_funboost_common_config(funboost_common_conf_field:str):
|
|
|
3
3
|
import funboost_config # 第一次启动funboost前还没这个文件,或者还没有初始化配置之前,就要使用使用配置.
|
|
4
4
|
return getattr(funboost_config.FunboostCommonConfig,funboost_common_conf_field)
|
|
5
5
|
except Exception as e:
|
|
6
|
-
print(e)
|
|
6
|
+
# print(e)
|
|
7
7
|
return None
|
|
@@ -15,7 +15,7 @@ def get_publish_time(paramsx: dict):
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
def delete_keys_and_return_new_dict(dictx: dict, keys: list = None):
|
|
18
|
-
dict_new = copy.
|
|
18
|
+
dict_new = copy.deepcopy(dictx) # 主要是去掉一级键 publish_time,浅拷贝即可。新的消息已经不是这样了。
|
|
19
19
|
keys = ['publish_time', 'publish_time_format', 'extra'] if keys is None else keys
|
|
20
20
|
for dict_key in keys:
|
|
21
21
|
try:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version: 46.
|
|
4
|
-
Summary: pip install funboost,python
|
|
3
|
+
Version: 46.1
|
|
4
|
+
Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
|
|
5
5
|
Home-page: https://github.com/ydf0509/funboost
|
|
6
6
|
Author: bfzs
|
|
7
7
|
Author-email: ydf0509@sohu.com
|
|
@@ -49,6 +49,8 @@ License-File: LICENSE
|
|
|
49
49
|
<pre style="color: greenyellow;background-color: #0c1119; font-size: medium;">
|
|
50
50
|
pip install funboost ,python全功能分布式函数调度框架。 demo用法例子见文档1.3
|
|
51
51
|
|
|
52
|
+
funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。
|
|
53
|
+
|
|
52
54
|
只需要一行@boost代码即可分布式执行python一切任意函数,99%用过funboost的pythoner 感受是 方便 快速 强大。
|
|
53
55
|
支持python所有类型的并发模式,消息队列方面支持全球一切知名消息队列中间件和模拟的实现消息队列,
|
|
54
56
|
同时funboost支持celery整个框架作为核心来发布和消费消息,使用funboost的极简api方式来自动化配置和利用celery调度,
|
|
@@ -101,6 +103,7 @@ funboost的旧框架名字是function_scheduling_distributed_framework , 关系
|
|
|
101
103
|
[查看分布式函数调度框架文档 https://funboost.readthedocs.io/zh-cn/latest/index.html](https://funboost.readthedocs.io/zh-cn/latest/index.html)
|
|
102
104
|
|
|
103
105
|
|
|
106
|
+
|
|
104
107
|
[funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
|
|
105
108
|
|
|
106
109
|
```
|
|
@@ -33,7 +33,7 @@ setup(
|
|
|
33
33
|
name='funboost', #
|
|
34
34
|
version=__version__,
|
|
35
35
|
description=(
|
|
36
|
-
'pip install funboost,python
|
|
36
|
+
'pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚 '
|
|
37
37
|
),
|
|
38
38
|
# long_description=open('README.md', 'r',encoding='utf8').read(),
|
|
39
39
|
keywords=["funboost", "distributed-framework", "function-scheduling", "rabbitmq", "rocketmq", "kafka", "nsq", "redis", "disk",
|
|
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-46.0 → funboost-46.1}/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-46.0 → funboost-46.1}/funboost/concurrent_pool/backup/async_pool_executor_janus.py
RENAMED
|
File without changes
|
|
File without changes
|
{funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-46.0 → funboost-46.1}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|