funboost 48.9__tar.gz → 49.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-48.9/funboost.egg-info → funboost-49.1}/PKG-INFO +10 -4
- {funboost-48.9 → funboost-49.1}/README.md +10 -4
- {funboost-48.9 → funboost-49.1}/funboost/__init__.py +1 -1
- {funboost-48.9 → funboost-49.1}/funboost/consumers/base_consumer.py +4 -4
- {funboost-48.9 → funboost-49.1}/funboost/consumers/redis_filter.py +47 -31
- {funboost-48.9 → funboost-49.1}/funboost/core/func_params_model.py +9 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/app.py +21 -6
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/rpc_call.html +1 -1
- {funboost-48.9 → funboost-49.1}/funboost/publishers/redis_publisher_priority.py +2 -2
- {funboost-48.9 → funboost-49.1}/funboost/timing_job/timing_job_base.py +1 -1
- {funboost-48.9 → funboost-49.1}/funboost/timing_job/timing_push.py +19 -3
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +1 -1
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/readme.md +1 -1
- {funboost-48.9 → funboost-49.1/funboost.egg-info}/PKG-INFO +10 -4
- {funboost-48.9 → funboost-49.1}/funboost.egg-info/requires.txt +1 -1
- {funboost-48.9 → funboost-49.1}/setup.py +1 -1
- {funboost-48.9 → funboost-49.1}/LICENSE +0 -0
- {funboost-48.9 → funboost-49.1}/MANIFEST.in +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/__init__old.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/__main__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/assist/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/assist/celery_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/assist/dramatiq_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/assist/faststream_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/assist/huey_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/assist/rocketry_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/assist/rq_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/assist/rq_windows_worker.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/assist/taskiq_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/async_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/async_pool_executor.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/backup/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/backup/grok_async_pool.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/base_pool_type.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/pool_commons.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/single_thread_executor.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/constant.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/celery_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/confirm_mixin.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/dramatiq_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/empty_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/faststream_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/http_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/http_consumer000.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/httpsqs_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/huey_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/kafka_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/kombu_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/local_python_queue_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/memory_deque_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/mongomq_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/mqtt_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/nameko_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/nats_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/nsq_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/peewee_conusmer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/persist_queue_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/pulsar_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/redis_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/redis_consumer_ack_able.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/redis_consumer_priority.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/redis_consumer_simple.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/redis_pubsub_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/redis_stream_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/rocketmq_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/rq_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/sqlachemy_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/tcp_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/txt_file_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/udp_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/consumers/zeromq_consumer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/contrib/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/contrib/api_publish_msg.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/contrib/django_db_deco.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/contrib/queue2queue.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/active_cousumer_info_getter.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/booster.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/cli/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/cli/discovery_boosters.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/cli/funboost_fire.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/current_task.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/exceptions.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/fabric_deploy_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/funboost_config_getter.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/funboost_time.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/function_result_status_config.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/function_result_status_saver.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/helper_funs.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/kill_remote_task.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/lazy_impoter.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/loggers.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/msg_result_getter.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/muliti_process_enhance.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/serialization.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/core/task_id_logger.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/factories/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/factories/consumer_factory.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/factories/publisher_factotry.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/funboost_config_deafult.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/__pycache__/app.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/app_debug_start.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/functions.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/assets/css/custom.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/assets/js/custom.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css/content_page_style.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css/style.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/css/font-awesome.min.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/FontAwesome.otf +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.eot +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.svg +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2 +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/select2/4.0.13/css/select2.min.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator.min.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator_bootstrap3.min.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/css/bootstrap.min.css +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.eot +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.svg +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.ttf +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff2 +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/images/bg.jpg +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/images/favicon.ico +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/images/password.png +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/images/tick.png +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/images/user.png +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/js/bootstrap-datetimepicker.min.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/js/echarts.min.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/js/form-memory.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/js/moment-with-locales.min.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/js/select2.min.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/js_cdn/bootstrap/3.3.7/js/bootstrap.min.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/js_cdn/chart.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/static/js_cdn/tabulator-tables@5.5.0/dist/js/tabulator.min.js +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/about.html +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/conusme_speed.html +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/fun_result_table.html +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/index.html +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/index_backup.html +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/login.html +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/queue_op.html +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/running_consumer_by_ip.html +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/function_result_web/templates/running_consumer_by_queue_name.html +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/base_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/celery_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/celery_publisher000.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/confluent_kafka_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/dramatiq_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/empty_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/faststream_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/http_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/httpsqs_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/huey_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/kafka_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/kombu_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/local_python_queue_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/meomory_deque_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/mongomq_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/mqtt_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/nameko_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/nats_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/nsq_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/peewee_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/persist_queue_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/pulsar_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/redis_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/redis_publisher_lpush.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/redis_publisher_simple.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/redis_pubsub_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/redis_stream_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/rocketmq_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/rq_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/sqla_queue_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/tcp_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/txt_file_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/udp_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/publishers/zeromq_publisher.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/queues/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/queues/memory_queues_map.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/queues/peewee_queue.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/queues/sqla_queue.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/set_frame_config.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/timing_job/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/apscheduler_monkey.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/block_exit.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/bulk_operation.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/class_utils.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/class_utils2.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/ctrl_c_end.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/custom_pysnooper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/decorators.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-313.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-313.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/develop_log.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/expire_lock.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/func_timeout/StoppableThread.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/func_timeout/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/func_timeout/dafunc.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/func_timeout/exceptions.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/func_timeout/py2_raise.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/func_timeout/py3_raise.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/json_helper.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/mongo_util.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/monkey_color_log.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/monkey_patches.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/mqtt_util.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/paramiko_util.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/pysnooper_ydf/utils.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/pysnooper_ydf/variables.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/rabbitmq_factory.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/redis_manager.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/redis_manager_old.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/resource_monitoring.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/restart_python.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/simple_data_class.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/str_utils.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/time_util.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/times/__init__.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/times/version.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost/utils/un_strict_json_dumps.py +0 -0
- {funboost-48.9 → funboost-49.1}/funboost.egg-info/SOURCES.txt +0 -0
- {funboost-48.9 → funboost-49.1}/funboost.egg-info/dependency_links.txt +0 -0
- {funboost-48.9 → funboost-49.1}/funboost.egg-info/entry_points.txt +0 -0
- {funboost-48.9 → funboost-49.1}/funboost.egg-info/top_level.txt +0 -0
- {funboost-48.9 → funboost-49.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version:
|
|
3
|
+
Version: 49.1
|
|
4
4
|
Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,funboost web manager 方便查看和管理消费函数;99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
|
|
5
5
|
Home-page: https://github.com/ydf0509/funboost
|
|
6
6
|
Author: bfzs
|
|
@@ -62,8 +62,8 @@ funboost的神奇之处在于它同时拥有"轻量级使用方式"和"重量级
|
|
|
62
62
|
python函数加速器,框架包罗万象,一统编程思维,兼容50% python编程业务场景,适用范围广。
|
|
63
63
|
python万能分布式函数调度框架,支持5种并发模式,30+种消息队列中间件
|
|
64
64
|
(不仅支持几乎所有你能想到的消息队列中间件,还支持本地磁盘队列、数据库队列 (SQLAlchemy, Peewee)、
|
|
65
|
-
内存队列、甚至是 HTTP 请求、WebSocket 等作为任务队列,甚至是将 Celery、Dramatiq、Huey 等其他框架整体作为其
|
|
66
|
-
funboost源码高扩展性的设计,造成“万物皆可为Broker”,并不是有30种传统意义上的经典消息队列,
|
|
65
|
+
内存队列、甚至是 HTTP 请求、WebSocket 等作为任务队列,甚至是将 Celery、Dramatiq、Huey 等其他框架整体作为其
|
|
66
|
+
Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”,并不是有30种传统意义上的经典消息队列,
|
|
67
67
|
因为世界上总共都没有30种知名的经典消息队列),
|
|
68
68
|
30种任务控制功能。给任意python函数赋能。
|
|
69
69
|
用途概念就是常规经典的 生产者 + 消息队列中间件 + 消费者 编程思想。
|
|
@@ -543,15 +543,21 @@ if __name__ == '__main__':
|
|
|
543
543
|
|
|
544
544
|
|
|
545
545
|
队列操作:查看和操作队列,包括 清空清空 暂停消费 恢复消费 调整qps和并发
|
|
546
|
-
[](https://imgse.com/i/pEJC6m9)
|
|
546
|
+
<!-- [](https://imgse.com/i/pEJC6m9) -->
|
|
547
|
+
[](https://imgse.com/i/pVSOJcq)
|
|
547
548
|
|
|
548
549
|
队列操作,查看消费者详情:查看队列的所有消费者详情
|
|
549
550
|
[](https://imgse.com/i/pEJCgT1)
|
|
550
551
|
|
|
552
|
+
队列操作:查看消费曲线图,查看各种消费指标。
|
|
553
|
+
[](https://imgse.com/i/pVpr7sP)
|
|
554
|
+
|
|
551
555
|
rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;根据taskid获取结果。
|
|
552
556
|
<!-- [](https://imgse.com/i/pETq8hj) -->
|
|
553
557
|
[](https://imgse.com/i/pE7y8oT)
|
|
554
558
|
|
|
559
|
+
|
|
560
|
+
|
|
555
561
|
## 1.4 python分布式函数执行为什么重要?
|
|
556
562
|
|
|
557
563
|
```text
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
noteId: "
|
|
2
|
+
noteId: "67d3a8f045e411f0ab0bf59d9f569ed4"
|
|
3
3
|
tags: []
|
|
4
4
|
|
|
5
5
|
---
|
|
@@ -35,8 +35,8 @@ funboost的神奇之处在于它同时拥有"轻量级使用方式"和"重量级
|
|
|
35
35
|
python函数加速器,框架包罗万象,一统编程思维,兼容50% python编程业务场景,适用范围广。
|
|
36
36
|
python万能分布式函数调度框架,支持5种并发模式,30+种消息队列中间件
|
|
37
37
|
(不仅支持几乎所有你能想到的消息队列中间件,还支持本地磁盘队列、数据库队列 (SQLAlchemy, Peewee)、
|
|
38
|
-
内存队列、甚至是 HTTP 请求、WebSocket 等作为任务队列,甚至是将 Celery、Dramatiq、Huey 等其他框架整体作为其
|
|
39
|
-
funboost源码高扩展性的设计,造成“万物皆可为Broker”,并不是有30种传统意义上的经典消息队列,
|
|
38
|
+
内存队列、甚至是 HTTP 请求、WebSocket 等作为任务队列,甚至是将 Celery、Dramatiq、Huey 等其他框架整体作为其
|
|
39
|
+
Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”,并不是有30种传统意义上的经典消息队列,
|
|
40
40
|
因为世界上总共都没有30种知名的经典消息队列),
|
|
41
41
|
30种任务控制功能。给任意python函数赋能。
|
|
42
42
|
用途概念就是常规经典的 生产者 + 消息队列中间件 + 消费者 编程思想。
|
|
@@ -516,15 +516,21 @@ if __name__ == '__main__':
|
|
|
516
516
|
|
|
517
517
|
|
|
518
518
|
队列操作:查看和操作队列,包括 清空清空 暂停消费 恢复消费 调整qps和并发
|
|
519
|
-
[](https://imgse.com/i/pEJC6m9)
|
|
519
|
+
<!-- [](https://imgse.com/i/pEJC6m9) -->
|
|
520
|
+
[](https://imgse.com/i/pVSOJcq)
|
|
520
521
|
|
|
521
522
|
队列操作,查看消费者详情:查看队列的所有消费者详情
|
|
522
523
|
[](https://imgse.com/i/pEJCgT1)
|
|
523
524
|
|
|
525
|
+
队列操作:查看消费曲线图,查看各种消费指标。
|
|
526
|
+
[](https://imgse.com/i/pVpr7sP)
|
|
527
|
+
|
|
524
528
|
rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;根据taskid获取结果。
|
|
525
529
|
<!-- [](https://imgse.com/i/pETq8hj) -->
|
|
526
530
|
[](https://imgse.com/i/pE7y8oT)
|
|
527
531
|
|
|
532
|
+
|
|
533
|
+
|
|
528
534
|
## 1.4 python分布式函数执行为什么重要?
|
|
529
535
|
|
|
530
536
|
```text
|
|
@@ -480,9 +480,9 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
480
480
|
return
|
|
481
481
|
function_only_params = delete_keys_and_return_new_dict(kw['body'], )
|
|
482
482
|
if self._get_priority_conf(kw, 'do_task_filtering') and self._redis_filter.check_value_exists(
|
|
483
|
-
function_only_params): # 对函数的参数进行检查,过滤已经执行过并且成功的任务。
|
|
483
|
+
function_only_params,self._get_priority_conf(kw, 'filter_str')): # 对函数的参数进行检查,过滤已经执行过并且成功的任务。
|
|
484
484
|
self.logger.warning(f'redis的 [{self._redis_filter_key_name}] 键 中 过滤任务 {kw["body"]}')
|
|
485
|
-
self._confirm_consume(kw)
|
|
485
|
+
self._confirm_consume(kw) # 不运行就必须确认消费,否则会发不能确认消费,导致消息队列中间件认为消息没有被消费。
|
|
486
486
|
return
|
|
487
487
|
publish_time = get_publish_time(kw['body'])
|
|
488
488
|
msg_expire_senconds_priority = self._get_priority_conf(kw, 'msg_expire_senconds')
|
|
@@ -678,7 +678,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
678
678
|
current_function_result_status.run_status = RunStatus.finish
|
|
679
679
|
self._result_persistence_helper.save_function_result_to_mongo(current_function_result_status)
|
|
680
680
|
if self._get_priority_conf(kw, 'do_task_filtering'):
|
|
681
|
-
self._redis_filter.add_a_value(function_only_params) # 函数执行成功后,添加函数的参数排序后的键值对字符串到set中。
|
|
681
|
+
self._redis_filter.add_a_value(function_only_params,self._get_priority_conf(kw, 'filter_str')) # 函数执行成功后,添加函数的参数排序后的键值对字符串到set中。
|
|
682
682
|
if current_function_result_status.success is False and current_retry_times == max_retry_times:
|
|
683
683
|
log_msg = f'函数 {self.consuming_function.__name__} 达到最大重试次数 {self._get_priority_conf(kw, "max_retry_times")} 后,仍然失败, 入参是 {function_only_params} '
|
|
684
684
|
if self.consumer_params.is_push_to_dlx_queue_when_retry_max_times:
|
|
@@ -832,7 +832,7 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
832
832
|
await simple_run_in_executor(self._result_persistence_helper.save_function_result_to_mongo, current_function_result_status)
|
|
833
833
|
if self._get_priority_conf(kw, 'do_task_filtering'):
|
|
834
834
|
# self._redis_filter.add_a_value(function_only_params) # 函数执行成功后,添加函数的参数排序后的键值对字符串到set中。
|
|
835
|
-
await simple_run_in_executor(self._redis_filter.add_a_value, function_only_params)
|
|
835
|
+
await simple_run_in_executor(self._redis_filter.add_a_value, function_only_params,self._get_priority_conf(kw, 'filter_str'))
|
|
836
836
|
if current_function_result_status.success is False and current_retry_times == max_retry_times:
|
|
837
837
|
log_msg = f'函数 {self.consuming_function.__name__} 达到最大重试次数 {self._get_priority_conf(kw, "max_retry_times")} 后,仍然失败, 入参是 {function_only_params} '
|
|
838
838
|
if self.consumer_params.is_push_to_dlx_queue_when_retry_max_times:
|
|
@@ -32,23 +32,36 @@ class RedisFilter(RedisMixin, FunboostFileLoggerMixin):
|
|
|
32
32
|
self._redis_key_name = redis_key_name
|
|
33
33
|
self._redis_filter_task_expire_seconds = redis_filter_task_expire_seconds
|
|
34
34
|
|
|
35
|
+
# @staticmethod
|
|
36
|
+
# def _get_ordered_str(value):
|
|
37
|
+
# """对json的键值对在redis中进行过滤,需要先把键值对排序,否则过滤会不准确如 {"a":1,"b":2} 和 {"b":2,"a":1}"""
|
|
38
|
+
# value = Serialization.to_dict(value)
|
|
39
|
+
# ordered_dict = OrderedDict()
|
|
40
|
+
# for k in sorted(value):
|
|
41
|
+
# ordered_dict[k] = value[k]
|
|
42
|
+
# return json.dumps(ordered_dict)
|
|
43
|
+
|
|
35
44
|
@staticmethod
|
|
36
|
-
def
|
|
45
|
+
def generate_filter_str(value: typing.Union[str, dict], filter_str: typing.Optional[str] = None):
|
|
37
46
|
"""对json的键值对在redis中进行过滤,需要先把键值对排序,否则过滤会不准确如 {"a":1,"b":2} 和 {"b":2,"a":1}"""
|
|
47
|
+
if filter_str: # 如果用户单独指定了过滤字符串,就使用使用户指定的过滤字符串,否则使用排序后的键值对字符串
|
|
48
|
+
return filter_str
|
|
38
49
|
value = Serialization.to_dict(value)
|
|
39
50
|
ordered_dict = OrderedDict()
|
|
40
51
|
for k in sorted(value):
|
|
41
52
|
ordered_dict[k] = value[k]
|
|
53
|
+
# print(ordered_dict,filter_str)
|
|
42
54
|
return json.dumps(ordered_dict)
|
|
43
55
|
|
|
44
|
-
def add_a_value(self, value: typing.Union[str, dict]):
|
|
45
|
-
self.redis_db_filter_and_rpc_result.sadd(self._redis_key_name, self._get_ordered_str(value))
|
|
46
56
|
|
|
47
|
-
def
|
|
48
|
-
self.redis_db_filter_and_rpc_result.
|
|
57
|
+
def add_a_value(self, value: typing.Union[str, dict], filter_str: typing.Optional[str] = None):
|
|
58
|
+
self.redis_db_filter_and_rpc_result.sadd(self._redis_key_name, self.generate_filter_str(value, filter_str))
|
|
49
59
|
|
|
50
|
-
def
|
|
51
|
-
|
|
60
|
+
def manual_delete_a_value(self, value: typing.Union[str, dict], filter_str: typing.Optional[str] = None):
|
|
61
|
+
self.redis_db_filter_and_rpc_result.srem(self._redis_key_name, self.generate_filter_str(value, filter_str))
|
|
62
|
+
|
|
63
|
+
def check_value_exists(self, value, filter_str: typing.Optional[str] = None):
|
|
64
|
+
return self.redis_db_filter_and_rpc_result.sismember(self._redis_key_name, self.generate_filter_str(value, filter_str))
|
|
52
65
|
|
|
53
66
|
def delete_expire_filter_task_cycle(self):
|
|
54
67
|
pass
|
|
@@ -61,15 +74,17 @@ class RedisImpermanencyFilter(RedisFilter):
|
|
|
61
74
|
如果是30分钟内发布过这个任务,则不执行1 + 2,现在把这个逻辑集成到框架,一般用于接口缓存。
|
|
62
75
|
"""
|
|
63
76
|
|
|
64
|
-
def add_a_value(self, value: typing.Union[str, dict]):
|
|
65
|
-
self.redis_db_filter_and_rpc_result.zadd(self._redis_key_name, {self.
|
|
77
|
+
def add_a_value(self, value: typing.Union[str, dict], filter_str: typing.Optional[str] = None):
|
|
78
|
+
self.redis_db_filter_and_rpc_result.zadd(self._redis_key_name, {self.generate_filter_str(value, filter_str):time.time()})
|
|
66
79
|
|
|
67
|
-
def manual_delete_a_value(self, value: typing.Union[str, dict]):
|
|
68
|
-
self.redis_db_filter_and_rpc_result.zrem(self._redis_key_name, self.
|
|
80
|
+
def manual_delete_a_value(self, value: typing.Union[str, dict], filter_str: typing.Optional[str] = None):
|
|
81
|
+
self.redis_db_filter_and_rpc_result.zrem(self._redis_key_name, self.generate_filter_str(value, filter_str))
|
|
69
82
|
|
|
70
|
-
def check_value_exists(self, value):
|
|
71
|
-
# print(self.redis_db_filter_and_rpc_result.zrank(self._redis_key_name, self.
|
|
72
|
-
|
|
83
|
+
def check_value_exists(self, value, filter_str: typing.Optional[str] = None):
|
|
84
|
+
# print(self.redis_db_filter_and_rpc_result.zrank(self._redis_key_name, self.generate_filter_str(value, filter_str)))
|
|
85
|
+
is_exists = False if self.redis_db_filter_and_rpc_result.zscore(self._redis_key_name, self.generate_filter_str(value, filter_str)) is None else True
|
|
86
|
+
# print(is_exists,value,filter_str,self.generate_filter_str(value, filter_str))
|
|
87
|
+
return is_exists
|
|
73
88
|
|
|
74
89
|
@decorators.keep_circulating(60, block=False)
|
|
75
90
|
def delete_expire_filter_task_cycle000(self):
|
|
@@ -111,16 +126,16 @@ class RedisImpermanencyFilterUsingRedisKey(RedisFilter):
|
|
|
111
126
|
"""
|
|
112
127
|
return f'{self._redis_key_name}:{value.replace(":", ":")}' # 任务是json,带有:会形成很多树,换成中文冒号。
|
|
113
128
|
|
|
114
|
-
def add_a_value(self, value: typing.Union[str, dict]):
|
|
115
|
-
redis_key = self.__add_dir_prefix(self.
|
|
129
|
+
def add_a_value(self, value: typing.Union[str, dict], filter_str: typing.Optional[str] = None):
|
|
130
|
+
redis_key = self.__add_dir_prefix(self.generate_filter_str(value, filter_str))
|
|
116
131
|
self.redis_db_filter_and_rpc_result.set(redis_key, 1)
|
|
117
132
|
self.redis_db_filter_and_rpc_result.expire(redis_key, self._redis_filter_task_expire_seconds)
|
|
118
133
|
|
|
119
|
-
def manual_delete_a_value(self, value: typing.Union[str, dict]):
|
|
120
|
-
self.redis_db_filter_and_rpc_result.delete(self.__add_dir_prefix(self.
|
|
134
|
+
def manual_delete_a_value(self, value: typing.Union[str, dict], filter_str: typing.Optional[str] = None):
|
|
135
|
+
self.redis_db_filter_and_rpc_result.delete(self.__add_dir_prefix(self.generate_filter_str(value, filter_str)))
|
|
121
136
|
|
|
122
|
-
def check_value_exists(self, value):
|
|
123
|
-
return True if self.redis_db_filter_and_rpc_result.exists(self.__add_dir_prefix(self.
|
|
137
|
+
def check_value_exists(self, value, filter_str: typing.Optional[str] = None):
|
|
138
|
+
return True if self.redis_db_filter_and_rpc_result.exists(self.__add_dir_prefix(self.generate_filter_str(value, filter_str))) else True
|
|
124
139
|
|
|
125
140
|
def delete_expire_filter_task_cycle(self):
|
|
126
141
|
"""
|
|
@@ -131,16 +146,17 @@ class RedisImpermanencyFilterUsingRedisKey(RedisFilter):
|
|
|
131
146
|
|
|
132
147
|
|
|
133
148
|
if __name__ == '__main__':
|
|
134
|
-
#
|
|
135
|
-
params_filter = RedisImpermanencyFilter('filter_zset:
|
|
149
|
+
# params_filter = RedisFilter('filter_set:abcdefgh2', 120)
|
|
150
|
+
params_filter = RedisImpermanencyFilter('filter_zset:abcdef2', 120)
|
|
136
151
|
# params_filter = RedisImpermanencyFilterUsingRedisKey('filter_dir', 300)
|
|
137
152
|
for i in range(10):
|
|
138
|
-
params_filter.add_a_value({'x': i, 'y': i * 2})
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
params_filter.
|
|
143
|
-
params_filter.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
153
|
+
# params_filter.add_a_value({'x': i, 'y': i * 2},str(i))
|
|
154
|
+
params_filter.add_a_value({'x': i, 'y': i * 2},None)
|
|
155
|
+
|
|
156
|
+
# params_filter.manual_delete_a_value({'a': 1, 'b': 2})
|
|
157
|
+
print(params_filter.check_value_exists({'x': 1, 'y': 2}))
|
|
158
|
+
# params_filter.delete_expire_filter_task_cycle()
|
|
159
|
+
# params_filter.add_a_value({'a': 1, 'b': 5})
|
|
160
|
+
# print(params_filter.check_value_exists({'a': 1, 'b': 2}))
|
|
161
|
+
# time.sleep(130)
|
|
162
|
+
# print(params_filter.check_value_exists({'a': 1, 'b': 2}))
|
|
@@ -308,6 +308,15 @@ class PriorityConsumingControlConfig(BaseJsonAbleModel):
|
|
|
308
308
|
misfire_grace_time: typing.Union[int, None] = None
|
|
309
309
|
|
|
310
310
|
other_extra_params: dict = None # 其他参数, 例如消息优先级 , priority_control_config=PriorityConsumingControlConfig(other_extra_params={'priroty': priorityxx}),
|
|
311
|
+
|
|
312
|
+
"""filter_str:
|
|
313
|
+
用户指定过滤字符串, 例如函数入参是 def fun(userid,username,sex,user_description),
|
|
314
|
+
默认是所有入参一起组成json来过滤,但其实只把userid的值来过滤就好了。所以如果需要精准的按照什么过滤,用户来灵活指定一个字符串就好了
|
|
315
|
+
|
|
316
|
+
用法见文档4.35
|
|
317
|
+
f3.publish(msg={'a':i,'b':i*2},priority_control_config=PriorityConsumingControlConfig(filter_str=str(i)))
|
|
318
|
+
"""
|
|
319
|
+
filter_str :typing.Optional[str] = None
|
|
311
320
|
|
|
312
321
|
@root_validator(skip_on_failure=True)
|
|
313
322
|
def cehck_values(cls, values: dict):
|
|
Binary file
|
|
@@ -221,10 +221,7 @@ def hearbeat_info_partion_by_ip():
|
|
|
221
221
|
def get_queue_params_and_active_consumers():
|
|
222
222
|
return jsonify(QueueConusmerParamsGetter().get_queue_params_and_active_consumers())
|
|
223
223
|
|
|
224
|
-
|
|
225
|
-
def get_message_count(broker_kind,queue_name):
|
|
226
|
-
publisher = BoostersManager.get_cross_project_publisher(PublisherParams(queue_name=queue_name, broker_kind=broker_kind, publish_msg_log_use_full_msg=True))
|
|
227
|
-
return jsonify({'count':publisher.get_message_count(),'success':True})
|
|
224
|
+
|
|
228
225
|
|
|
229
226
|
|
|
230
227
|
@app.route('/queue/clear/<broker_kind>/<queue_name>',methods=['POST'])
|
|
@@ -243,9 +240,27 @@ def resume_consume(queue_name):
|
|
|
243
240
|
RedisMixin().redis_db_frame.hset(RedisKeys.REDIS_KEY_PAUSE_FLAG, queue_name,'0')
|
|
244
241
|
return jsonify({'success':True})
|
|
245
242
|
|
|
246
|
-
@app.route('/queue/
|
|
247
|
-
def
|
|
243
|
+
@app.route('/queue/get_msg_num_all_queues',methods=['GET'])
|
|
244
|
+
def get_msg_num_all_queues():
|
|
245
|
+
"""这个是通过消费者周期每隔10秒上报到redis的,性能好。不需要实时获取每个消息队列,直接从redis读取所有队列的消息数量"""
|
|
248
246
|
return jsonify(QueueConusmerParamsGetter().get_msg_num(ignore_report_ts=True))
|
|
247
|
+
|
|
248
|
+
@app.route('/queue/message_count/<broker_kind>/<queue_name>')
|
|
249
|
+
def get_message_count(broker_kind,queue_name):
|
|
250
|
+
"""这个是实时获取每个消息队列的消息数量,性能差,但是可以实时获取每个消息队列的消息数量"""
|
|
251
|
+
queue_params = QueueConusmerParamsGetter().get_queue_params()
|
|
252
|
+
for queue_namex,params in queue_params.items():
|
|
253
|
+
if params['broker_kind'] == broker_kind and queue_namex == queue_name:
|
|
254
|
+
publisher = BoostersManager.get_cross_project_publisher(
|
|
255
|
+
PublisherParams(queue_name=queue_name,
|
|
256
|
+
broker_kind=broker_kind,
|
|
257
|
+
broker_exclusive_config=params['broker_exclusive_config'],
|
|
258
|
+
publish_msg_log_use_full_msg=True))
|
|
259
|
+
return jsonify({'count':publisher.get_message_count(),'success':True})
|
|
260
|
+
return jsonify({'success':False,'msg':f'队列{queue_name}不存在'})
|
|
261
|
+
|
|
262
|
+
publisher = BoostersManager.get_cross_project_publisher(PublisherParams(queue_name=queue_name, broker_kind=broker_kind, publish_msg_log_use_full_msg=True))
|
|
263
|
+
return jsonify({'count':publisher.get_message_count(),'success':True})
|
|
249
264
|
|
|
250
265
|
@app.route('/rpc/rpc_call',methods=['POST'])
|
|
251
266
|
def rpc_call():
|
|
@@ -14,7 +14,7 @@ class RedisPriorityPublisher(FlushRedisQueueMixin,AbstractPublisher, RedisMixin,
|
|
|
14
14
|
|
|
15
15
|
def custom_init(self):
|
|
16
16
|
queue_list = [self._queue_name]
|
|
17
|
-
x_max_priority = self.publisher_params.broker_exclusive_config
|
|
17
|
+
x_max_priority = self.publisher_params.broker_exclusive_config.get('x-max-priority')
|
|
18
18
|
if x_max_priority:
|
|
19
19
|
for i in range(1, x_max_priority + 1):
|
|
20
20
|
queue_list.append(f'{self.queue_name}:{i}')
|
|
@@ -28,7 +28,7 @@ class RedisPriorityPublisher(FlushRedisQueueMixin,AbstractPublisher, RedisMixin,
|
|
|
28
28
|
:return:
|
|
29
29
|
"""
|
|
30
30
|
priority = self._get_from_other_extra_params('priroty', msg)
|
|
31
|
-
x_max_priority = self.publisher_params.broker_exclusive_config
|
|
31
|
+
x_max_priority = self.publisher_params.broker_exclusive_config('x-max-priority')
|
|
32
32
|
queue_name = self.queue_name
|
|
33
33
|
if x_max_priority and priority:
|
|
34
34
|
priority = min(priority, x_max_priority) # 防止有傻瓜发布消息的优先级priroty比最大支持的优先级还高。
|
|
@@ -59,7 +59,7 @@ class ThreadPoolExecutorForAps(BasePoolExecutor):
|
|
|
59
59
|
ThreadPoolExecutor constructor
|
|
60
60
|
"""
|
|
61
61
|
|
|
62
|
-
def __init__(self, max_workers=
|
|
62
|
+
def __init__(self, max_workers=100, pool_kwargs=None):
|
|
63
63
|
pool = ThreadPoolExecutorShrinkAble(int(max_workers), )
|
|
64
64
|
super().__init__(pool)
|
|
65
65
|
|
|
@@ -76,9 +76,23 @@ class ApsJobAdder:
|
|
|
76
76
|
next_run_time=undefined, jobstore='default', executor='default',
|
|
77
77
|
replace_existing=False, **trigger_args, ):
|
|
78
78
|
"""
|
|
79
|
-
这里的入参都是和apscheduler的add_job的入参一样的,funboost作者没有创造新的入参。
|
|
79
|
+
1. 这里的入参都是和apscheduler的add_job的入参一样的,funboost作者没有创造新的入参。
|
|
80
80
|
但是官方apscheduler的入参第一个入参是函数,
|
|
81
81
|
funboost的ApsJobAdder对象.add_push_job入参去掉了函数,因为类的实例化时候会把函数传进来,不需要再麻烦用户一次了。
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
2. add_push_job目的是 定时运行 消费函数.push方法发布消息到消费队列, 而不是 定时直接运行 消费函数自身。
|
|
85
|
+
|
|
86
|
+
相当于 aps_obj.add_job(消费函数.push, trigger, args, kwargs, id, name, .....)
|
|
87
|
+
那为什么 不直接使用 aps_obj.add_job(消费函数.push, trigger, args, kwargs, id, name, .....) 呢?因为 消费函数.push是实例方法,
|
|
88
|
+
如果redis作为 jobstore, 消费函数.push 会报错,因为 消费函数.push 是实例方法,不能被序列化。只有普通函数和静态方法才能被序列化。
|
|
89
|
+
所以开发了一个 add_push_job方法, 里面再去用 add_job, 使用 push_fun_params_to_broker 这个普通函数作为 add_job 的第一个入参,
|
|
90
|
+
这个普通函数里面再去调用 消费函数.push 方法, 相当于是曲线救国避免 aps_obj.add_job(消费函数.push 不可序列化问题。
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
3. 用户也可以自己定义一个普通函数my_push,你这个普通函数my_push 里面去调用消费函数.push方法;然后使用 aps_obj.add_job 使用你自己定义的这个my_push作为第一个入参。
|
|
94
|
+
这种方式更容易你去理解,和apscheduler 官方库的原生写法一模一样。 但是不如 add_push_job 方便,因为 需要你亲自给每个消费函数分别定义一个普通函数my_push。
|
|
95
|
+
|
|
82
96
|
"""
|
|
83
97
|
|
|
84
98
|
# if not getattr(self.aps_obj, 'has_started_flag', False):
|
|
@@ -118,14 +132,16 @@ if __name__ == '__main__':
|
|
|
118
132
|
ApsJobAdder(sum_two_numbers, job_store_kind='redis').add_push_job(
|
|
119
133
|
trigger='date',
|
|
120
134
|
run_date='2025-01-17 23:25:40',
|
|
121
|
-
args=(7, 8)
|
|
135
|
+
args=(7, 8),
|
|
136
|
+
id='date_job1'
|
|
122
137
|
)
|
|
123
138
|
|
|
124
139
|
# 方式2:固定间隔执行
|
|
125
140
|
ApsJobAdder(sum_two_numbers, job_store_kind='memory').add_push_job(
|
|
126
141
|
trigger='interval',
|
|
127
142
|
seconds=5,
|
|
128
|
-
args=(4, 6)
|
|
143
|
+
args=(4, 6),
|
|
144
|
+
id='interval_job1'
|
|
129
145
|
)
|
|
130
146
|
|
|
131
147
|
# 方式3:使用cron表达式定时执行
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version:
|
|
3
|
+
Version: 49.1
|
|
4
4
|
Summary: pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,funboost web manager 方便查看和管理消费函数;99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚
|
|
5
5
|
Home-page: https://github.com/ydf0509/funboost
|
|
6
6
|
Author: bfzs
|
|
@@ -62,8 +62,8 @@ funboost的神奇之处在于它同时拥有"轻量级使用方式"和"重量级
|
|
|
62
62
|
python函数加速器,框架包罗万象,一统编程思维,兼容50% python编程业务场景,适用范围广。
|
|
63
63
|
python万能分布式函数调度框架,支持5种并发模式,30+种消息队列中间件
|
|
64
64
|
(不仅支持几乎所有你能想到的消息队列中间件,还支持本地磁盘队列、数据库队列 (SQLAlchemy, Peewee)、
|
|
65
|
-
内存队列、甚至是 HTTP 请求、WebSocket 等作为任务队列,甚至是将 Celery、Dramatiq、Huey 等其他框架整体作为其
|
|
66
|
-
funboost源码高扩展性的设计,造成“万物皆可为Broker”,并不是有30种传统意义上的经典消息队列,
|
|
65
|
+
内存队列、甚至是 HTTP 请求、WebSocket 等作为任务队列,甚至是将 Celery、Dramatiq、Huey 等其他框架整体作为其
|
|
66
|
+
Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”,并不是有30种传统意义上的经典消息队列,
|
|
67
67
|
因为世界上总共都没有30种知名的经典消息队列),
|
|
68
68
|
30种任务控制功能。给任意python函数赋能。
|
|
69
69
|
用途概念就是常规经典的 生产者 + 消息队列中间件 + 消费者 编程思想。
|
|
@@ -543,15 +543,21 @@ if __name__ == '__main__':
|
|
|
543
543
|
|
|
544
544
|
|
|
545
545
|
队列操作:查看和操作队列,包括 清空清空 暂停消费 恢复消费 调整qps和并发
|
|
546
|
-
[](https://imgse.com/i/pEJC6m9)
|
|
546
|
+
<!-- [](https://imgse.com/i/pEJC6m9) -->
|
|
547
|
+
[](https://imgse.com/i/pVSOJcq)
|
|
547
548
|
|
|
548
549
|
队列操作,查看消费者详情:查看队列的所有消费者详情
|
|
549
550
|
[](https://imgse.com/i/pEJCgT1)
|
|
550
551
|
|
|
552
|
+
队列操作:查看消费曲线图,查看各种消费指标。
|
|
553
|
+
[](https://imgse.com/i/pVpr7sP)
|
|
554
|
+
|
|
551
555
|
rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;根据taskid获取结果。
|
|
552
556
|
<!-- [](https://imgse.com/i/pETq8hj) -->
|
|
553
557
|
[](https://imgse.com/i/pE7y8oT)
|
|
554
558
|
|
|
559
|
+
|
|
560
|
+
|
|
555
561
|
## 1.4 python分布式函数执行为什么重要?
|
|
556
562
|
|
|
557
563
|
```text
|
|
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
|
{funboost-48.9 → funboost-49.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-48.9 → funboost-49.1}/funboost/concurrent_pool/backup/async_pool_executor_janus.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-48.9 → funboost-49.1}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-48.9 → funboost-49.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
|