funboost 49.2__tar.gz → 49.3__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-49.2/funboost.egg-info → funboost-49.3}/PKG-INFO +85 -19
- {funboost-49.2 → funboost-49.3}/README.md +84 -18
- {funboost-49.2 → funboost-49.3}/funboost/__init__.py +1 -1
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/async_pool_executor.py +8 -10
- {funboost-49.2 → funboost-49.3}/funboost/consumers/rocketmq_consumer.py +2 -2
- {funboost-49.2 → funboost-49.3}/funboost/publishers/redis_publisher_priority.py +1 -1
- {funboost-49.2 → funboost-49.3/funboost.egg-info}/PKG-INFO +85 -19
- {funboost-49.2 → funboost-49.3}/LICENSE +0 -0
- {funboost-49.2 → funboost-49.3}/MANIFEST.in +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/__init__old.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/__main__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/assist/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/assist/celery_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/assist/dramatiq_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/assist/faststream_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/assist/huey_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/assist/rocketry_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/assist/rq_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/assist/rq_windows_worker.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/assist/taskiq_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/async_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/backup/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/backup/grok_async_pool.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/base_pool_type.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/pool_commons.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/single_thread_executor.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/constant.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/base_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/celery_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/confirm_mixin.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/dramatiq_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/empty_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/faststream_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/http_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/http_consumer000.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/httpsqs_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/huey_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/kafka_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/kombu_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/local_python_queue_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/memory_deque_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/mongomq_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/mqtt_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/nameko_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/nats_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/nsq_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/peewee_conusmer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/persist_queue_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/pulsar_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/redis_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/redis_consumer_ack_able.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/redis_consumer_priority.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/redis_consumer_simple.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/redis_filter.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/redis_pubsub_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/redis_stream_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/rq_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/sqlachemy_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/tcp_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/txt_file_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/udp_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/consumers/zeromq_consumer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/contrib/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/contrib/api_publish_msg.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/contrib/django_db_deco.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/contrib/queue2queue.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/active_cousumer_info_getter.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/booster.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/cli/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/cli/discovery_boosters.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/cli/funboost_fire.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/current_task.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/exceptions.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/fabric_deploy_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/funboost_config_getter.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/funboost_time.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/func_params_model.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/function_result_status_config.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/function_result_status_saver.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/helper_funs.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/kill_remote_task.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/lazy_impoter.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/loggers.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/msg_result_getter.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/muliti_process_enhance.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/serialization.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/core/task_id_logger.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/factories/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/factories/consumer_factory.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/factories/publisher_factotry.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/funboost_config_deafult.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/__pycache__/app.cpython-313.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/__pycache__/app.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/__pycache__/functions.cpython-313.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/app.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/app_debug_start.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/functions.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/assets/css/custom.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/assets/js/custom.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css/content_page_style.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css/style.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/css/font-awesome.min.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/FontAwesome.otf +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.eot +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.svg +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2 +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/select2/4.0.13/css/select2.min.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator.min.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator_bootstrap3.min.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/css/bootstrap.min.css +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.eot +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.svg +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.ttf +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff2 +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/images/bg.jpg +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/images/favicon.ico +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/images/password.png +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/images/tick.png +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/images/user.png +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/js/bootstrap-datetimepicker.min.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/js/echarts.min.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/js/form-memory.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/js/moment-with-locales.min.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/js/select2.min.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/js_cdn/bootstrap/3.3.7/js/bootstrap.min.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/js_cdn/chart.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/static/js_cdn/tabulator-tables@5.5.0/dist/js/tabulator.min.js +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/about.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/conusme_speed.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/fun_result_table.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/index.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/index_backup.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/login.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/queue_op.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/rpc_call.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/running_consumer_by_ip.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/function_result_web/templates/running_consumer_by_queue_name.html +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/base_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/celery_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/celery_publisher000.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/confluent_kafka_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/dramatiq_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/empty_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/faststream_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/http_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/httpsqs_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/huey_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/kafka_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/kombu_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/local_python_queue_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/meomory_deque_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/mongomq_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/mqtt_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/nameko_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/nats_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/nsq_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/peewee_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/persist_queue_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/pulsar_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/redis_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/redis_publisher_lpush.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/redis_publisher_simple.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/redis_pubsub_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/redis_stream_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/rocketmq_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/rq_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/sqla_queue_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/tcp_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/txt_file_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/udp_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/publishers/zeromq_publisher.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/queues/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/queues/memory_queues_map.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/queues/peewee_queue.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/queues/sqla_queue.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/set_frame_config.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/timing_job/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/timing_job/timing_job_base.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/timing_job/timing_push.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/apscheduler_monkey.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/block_exit.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/bulk_operation.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/class_utils.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/class_utils2.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/ctrl_c_end.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/custom_pysnooper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/decorators.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-313.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-313.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/develop_log.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/expire_lock.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/func_timeout/StoppableThread.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/func_timeout/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/func_timeout/dafunc.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/func_timeout/exceptions.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/func_timeout/py2_raise.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/func_timeout/py3_raise.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/json_helper.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/mongo_util.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/monkey_color_log.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/monkey_patches.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/mqtt_util.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/paramiko_util.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/pysnooper_ydf/utils.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/pysnooper_ydf/variables.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/rabbitmq_factory.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/redis_manager.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/redis_manager_old.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/resource_monitoring.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/restart_python.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/simple_data_class.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/str_utils.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/time_util.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/times/__init__.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/times/version.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost/utils/un_strict_json_dumps.py +0 -0
- {funboost-49.2 → funboost-49.3}/funboost.egg-info/SOURCES.txt +0 -0
- {funboost-49.2 → funboost-49.3}/funboost.egg-info/dependency_links.txt +0 -0
- {funboost-49.2 → funboost-49.3}/funboost.egg-info/entry_points.txt +0 -0
- {funboost-49.2 → funboost-49.3}/funboost.egg-info/requires.txt +0 -0
- {funboost-49.2 → funboost-49.3}/funboost.egg-info/top_level.txt +0 -0
- {funboost-49.2 → funboost-49.3}/setup.cfg +0 -0
- {funboost-49.2 → funboost-49.3}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version: 49.
|
|
3
|
+
Version: 49.3
|
|
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
|
|
@@ -73,8 +73,10 @@ Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”
|
|
|
73
73
|
框架对代码没有入侵,可以加到任意已有项目而对项目python文件目录结构0要求,
|
|
74
74
|
不像 celery django scrapy 这样的框架,要从一开始就开始规划好项目目录结构,如果不想用框架了,
|
|
75
75
|
或者想改变使用其他框架框架,那么已经所写的代码组织形式就几乎成了废物,需要大改特改.
|
|
76
|
-
但是funboost
|
|
76
|
+
但是funboost完全不会这样,就算是加上或去掉@boost装饰器,对你的项目影响为0,用户照常使用,
|
|
77
77
|
所以用户可以对任意项目,任意时候,引入使用funboost或者去掉使用funboost,代码组织形式不需要发生变化.
|
|
78
|
+
(即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数有@boost装饰器对函数自身的直接调用运行没有任何影响,
|
|
79
|
+
用户照样可以直接例如 fun(x,y)是直接运行函数 , fun.push(x,y) 才是发送到消息队列)
|
|
78
80
|
|
|
79
81
|
通过funboost web manager 管理系统,支持全面 查看 监控 管理 funboost的任务消费。
|
|
80
82
|
</pre>
|
|
@@ -486,26 +488,32 @@ if __name__ == "__main__":
|
|
|
486
488
|
|
|
487
489
|
|
|
488
490
|
|
|
489
|
-
## 1.3.2 funboost
|
|
491
|
+
## 1.3.2 funboost集中演示一个功能更多的综合例子
|
|
490
492
|
|
|
491
493
|
```python
|
|
492
494
|
|
|
495
|
+
|
|
493
496
|
"""
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
497
|
+
一个展示更全面 funboost 用法的例子
|
|
498
|
+
包含了
|
|
499
|
+
1.继承BoosterParams,为了每个装饰器少写入参
|
|
500
|
+
2.rpc获取结果
|
|
501
|
+
3.连续丝滑启动多个消费函数
|
|
502
|
+
4.定时任务
|
|
498
503
|
"""
|
|
499
|
-
from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum
|
|
504
|
+
from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum,ApsJobAdder
|
|
500
505
|
import time
|
|
501
506
|
|
|
502
507
|
class MyBoosterParams(BoosterParams): # 自定义的参数类,继承BoosterParams,用于减少每个消费函数装饰器的重复相同入参个数
|
|
503
|
-
broker_kind: str = BrokerEnum.
|
|
508
|
+
broker_kind: str = BrokerEnum.REDIS_ACK_ABLE
|
|
504
509
|
max_retry_times: int = 3
|
|
505
510
|
concurrent_mode: str = ConcurrentModeEnum.THREADING
|
|
506
511
|
|
|
507
512
|
|
|
508
|
-
@boost(MyBoosterParams(queue_name='s1_queue', qps=1,
|
|
513
|
+
@boost(MyBoosterParams(queue_name='s1_queue', qps=1,
|
|
514
|
+
# do_task_filtering=True, # 可开启任务过滤,防止重复入参消费。
|
|
515
|
+
is_using_rpc_mode=True, # 开启rpc模式,支持rpc获取结果
|
|
516
|
+
))
|
|
509
517
|
def step1(a:int,b:int):
|
|
510
518
|
print(f'a={a},b={b}')
|
|
511
519
|
time.sleep(0.7)
|
|
@@ -514,20 +522,75 @@ def step1(a:int,b:int):
|
|
|
514
522
|
return a+b
|
|
515
523
|
|
|
516
524
|
|
|
517
|
-
@boost(MyBoosterParams(queue_name='s2_queue', qps=3,
|
|
518
|
-
|
|
525
|
+
@boost(MyBoosterParams(queue_name='s2_queue', qps=3,
|
|
526
|
+
max_retry_times=5,# 可以在此覆盖MyBoosterParams中的默认值,例如为step2单独设置最大重试次数为5
|
|
527
|
+
))
|
|
528
|
+
def step2(c:int,d:int,e:int=666):
|
|
519
529
|
time.sleep(3)
|
|
520
530
|
print(f'c={c},d={d},e={e}')
|
|
521
531
|
return c* d * e
|
|
522
532
|
|
|
523
533
|
|
|
524
534
|
if __name__ == '__main__':
|
|
525
|
-
|
|
526
|
-
|
|
535
|
+
step1.clear() # 清空队列
|
|
536
|
+
step2.clear() # 清空队列
|
|
537
|
+
|
|
527
538
|
step1.consume() # 调用.consume是非阻塞的启动消费,是在单独的子线程中循环拉取消息的。
|
|
528
539
|
# 有的人还担心阻塞而手动使用 threading.Thread(target=step1.consume).start() 来启动消费,这是完全多此一举的错误写法。
|
|
529
|
-
step2.consume() #
|
|
530
|
-
|
|
540
|
+
step2.consume() # 所以可以在当前主线程连续无阻塞丝滑的启动多个函数消费。
|
|
541
|
+
step2.multi_process_consume(3) # 这是多进程叠加了多线程消费,另外开启了3个进程,叠加了默认的线程并发。
|
|
542
|
+
|
|
543
|
+
async_result = step1.push(100,b=200)
|
|
544
|
+
print('step1的rpc结果是:',async_result.result) # rpc阻塞等待消step1的费结果返回
|
|
545
|
+
|
|
546
|
+
for i in range(100):
|
|
547
|
+
step1.push(i,i*2) # 向 step1函数的队列发送消息,入参和手动调用函数那样很相似。
|
|
548
|
+
step1.publish ({'a':i,'b':i*2},task_id=f'task_{i}') # publish 第一个入参是字典,比push能传递更多funboost的辅助参数,类似celery的apply_async和delay的关系。一个简单,一个复杂但强大。
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
"""
|
|
553
|
+
1.funboost 使用 ApsJobAdder.add_push_job来添加定时任务,不是add_job。
|
|
554
|
+
2.funboost是轻度封装的知名apscheduler框架,所以定时任务的语法和apscheduler是一样的,没有自己发明语法和入参
|
|
555
|
+
用户需要苦学apscheduler教程,一切定时都是要学apscheduler知识,定时和funboost知识关系很小。
|
|
556
|
+
3.funboost的定时任务目的是定时推送消息到消息队列中,而不是定时直接在当前程序中执行某个消费函数。
|
|
557
|
+
|
|
558
|
+
下面是三种方式添加定时任务,这些定时方式都是知名apscheduler包的定时方式,和funboost没关系。
|
|
559
|
+
"""
|
|
560
|
+
# 方式1:指定日期执行一次
|
|
561
|
+
ApsJobAdder(step2,
|
|
562
|
+
job_store_kind='redis', # 使用reids作为 apscheduler的 jobstrores
|
|
563
|
+
is_auto_start=True, # 添加任务,并同时顺便启动了定时器 执行了apscheduler对象.start()
|
|
564
|
+
).add_push_job(
|
|
565
|
+
trigger='date',
|
|
566
|
+
run_date='2025-06-30 16:25:40',
|
|
567
|
+
args=(7, 8,9),
|
|
568
|
+
id='date_job1',
|
|
569
|
+
replace_existing=True,
|
|
570
|
+
)
|
|
571
|
+
|
|
572
|
+
# 方式2:固定间隔执行
|
|
573
|
+
ApsJobAdder(step2, job_store_kind='redis').add_push_job(
|
|
574
|
+
trigger='interval',
|
|
575
|
+
seconds=30,
|
|
576
|
+
args=(4, 6,10),
|
|
577
|
+
id='interval_job1',
|
|
578
|
+
replace_existing=True,
|
|
579
|
+
)
|
|
580
|
+
|
|
581
|
+
# 方式3:使用cron表达式定时执行
|
|
582
|
+
ApsJobAdder(step2, job_store_kind='redis').add_push_job(
|
|
583
|
+
trigger='cron',
|
|
584
|
+
day_of_week='*',
|
|
585
|
+
hour=23,
|
|
586
|
+
minute=49,
|
|
587
|
+
second=50,
|
|
588
|
+
kwargs={"c": 50, "d": 60,"e":70},
|
|
589
|
+
replace_existing=True,
|
|
590
|
+
id='cron_job1')
|
|
591
|
+
|
|
592
|
+
ctrl_c_recv() # 用于阻塞代码,阻止主线程退出,使主线程永久运行。 相当于 你在代码最末尾,加了个 while 1:time.sleep(10),使主线程永不结束。apscheduler background定时器守护线程需要这样保持定时器不退出。
|
|
593
|
+
|
|
531
594
|
|
|
532
595
|
```
|
|
533
596
|
|
|
@@ -595,14 +658,17 @@ python比其他语言更需要分布式函数调度框架来执行函数,有
|
|
|
595
658
|
|
|
596
659
|
## 1.6 funboost支持支持celery框架整体作为funboost的broker (2023.4新增)
|
|
597
660
|
```
|
|
598
|
-
见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api
|
|
661
|
+
见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api,
|
|
662
|
+
核心的消费调度和发布和定时功能,都是由celery框架来完成,funboost框架的发布和调度代码不实际起作用。
|
|
599
663
|
用户操作funboost的api,语法和使用其他消息队列中间件类型一样,funboost自动化操作celery。
|
|
600
664
|
|
|
601
665
|
用户无需操作celery本身,无需敲击celery难记的命令行启动消费、定时、flower;
|
|
602
666
|
用户无需小心翼翼纠结亲自使用celery时候怎么规划目录结构 文件夹命名 需要怎么在配置写include 写task_routes,
|
|
603
|
-
完全不存在需要固定的celery
|
|
667
|
+
完全不存在需要固定的celery目录结构,不需要手动配置懵逼的任务路由,
|
|
668
|
+
不需要配置每个函数怎么使用不同的队列名字,funboost自动搞定这些。
|
|
604
669
|
|
|
605
|
-
用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind
|
|
670
|
+
用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind,
|
|
671
|
+
远远的暴击亲自使用无法ide下代码补全的celery框架的语法。
|
|
606
672
|
```
|
|
607
673
|
|
|
608
674
|
```
|
|
@@ -39,8 +39,10 @@ Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”
|
|
|
39
39
|
框架对代码没有入侵,可以加到任意已有项目而对项目python文件目录结构0要求,
|
|
40
40
|
不像 celery django scrapy 这样的框架,要从一开始就开始规划好项目目录结构,如果不想用框架了,
|
|
41
41
|
或者想改变使用其他框架框架,那么已经所写的代码组织形式就几乎成了废物,需要大改特改.
|
|
42
|
-
但是funboost
|
|
42
|
+
但是funboost完全不会这样,就算是加上或去掉@boost装饰器,对你的项目影响为0,用户照常使用,
|
|
43
43
|
所以用户可以对任意项目,任意时候,引入使用funboost或者去掉使用funboost,代码组织形式不需要发生变化.
|
|
44
|
+
(即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数有@boost装饰器对函数自身的直接调用运行没有任何影响,
|
|
45
|
+
用户照样可以直接例如 fun(x,y)是直接运行函数 , fun.push(x,y) 才是发送到消息队列)
|
|
44
46
|
|
|
45
47
|
通过funboost web manager 管理系统,支持全面 查看 监控 管理 funboost的任务消费。
|
|
46
48
|
</pre>
|
|
@@ -452,26 +454,32 @@ if __name__ == "__main__":
|
|
|
452
454
|
|
|
453
455
|
|
|
454
456
|
|
|
455
|
-
## 1.3.2 funboost
|
|
457
|
+
## 1.3.2 funboost集中演示一个功能更多的综合例子
|
|
456
458
|
|
|
457
459
|
```python
|
|
458
460
|
|
|
461
|
+
|
|
459
462
|
"""
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
463
|
+
一个展示更全面 funboost 用法的例子
|
|
464
|
+
包含了
|
|
465
|
+
1.继承BoosterParams,为了每个装饰器少写入参
|
|
466
|
+
2.rpc获取结果
|
|
467
|
+
3.连续丝滑启动多个消费函数
|
|
468
|
+
4.定时任务
|
|
464
469
|
"""
|
|
465
|
-
from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum
|
|
470
|
+
from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum,ApsJobAdder
|
|
466
471
|
import time
|
|
467
472
|
|
|
468
473
|
class MyBoosterParams(BoosterParams): # 自定义的参数类,继承BoosterParams,用于减少每个消费函数装饰器的重复相同入参个数
|
|
469
|
-
broker_kind: str = BrokerEnum.
|
|
474
|
+
broker_kind: str = BrokerEnum.REDIS_ACK_ABLE
|
|
470
475
|
max_retry_times: int = 3
|
|
471
476
|
concurrent_mode: str = ConcurrentModeEnum.THREADING
|
|
472
477
|
|
|
473
478
|
|
|
474
|
-
@boost(MyBoosterParams(queue_name='s1_queue', qps=1,
|
|
479
|
+
@boost(MyBoosterParams(queue_name='s1_queue', qps=1,
|
|
480
|
+
# do_task_filtering=True, # 可开启任务过滤,防止重复入参消费。
|
|
481
|
+
is_using_rpc_mode=True, # 开启rpc模式,支持rpc获取结果
|
|
482
|
+
))
|
|
475
483
|
def step1(a:int,b:int):
|
|
476
484
|
print(f'a={a},b={b}')
|
|
477
485
|
time.sleep(0.7)
|
|
@@ -480,20 +488,75 @@ def step1(a:int,b:int):
|
|
|
480
488
|
return a+b
|
|
481
489
|
|
|
482
490
|
|
|
483
|
-
@boost(MyBoosterParams(queue_name='s2_queue', qps=3,
|
|
484
|
-
|
|
491
|
+
@boost(MyBoosterParams(queue_name='s2_queue', qps=3,
|
|
492
|
+
max_retry_times=5,# 可以在此覆盖MyBoosterParams中的默认值,例如为step2单独设置最大重试次数为5
|
|
493
|
+
))
|
|
494
|
+
def step2(c:int,d:int,e:int=666):
|
|
485
495
|
time.sleep(3)
|
|
486
496
|
print(f'c={c},d={d},e={e}')
|
|
487
497
|
return c* d * e
|
|
488
498
|
|
|
489
499
|
|
|
490
500
|
if __name__ == '__main__':
|
|
491
|
-
|
|
492
|
-
|
|
501
|
+
step1.clear() # 清空队列
|
|
502
|
+
step2.clear() # 清空队列
|
|
503
|
+
|
|
493
504
|
step1.consume() # 调用.consume是非阻塞的启动消费,是在单独的子线程中循环拉取消息的。
|
|
494
505
|
# 有的人还担心阻塞而手动使用 threading.Thread(target=step1.consume).start() 来启动消费,这是完全多此一举的错误写法。
|
|
495
|
-
step2.consume() #
|
|
496
|
-
|
|
506
|
+
step2.consume() # 所以可以在当前主线程连续无阻塞丝滑的启动多个函数消费。
|
|
507
|
+
step2.multi_process_consume(3) # 这是多进程叠加了多线程消费,另外开启了3个进程,叠加了默认的线程并发。
|
|
508
|
+
|
|
509
|
+
async_result = step1.push(100,b=200)
|
|
510
|
+
print('step1的rpc结果是:',async_result.result) # rpc阻塞等待消step1的费结果返回
|
|
511
|
+
|
|
512
|
+
for i in range(100):
|
|
513
|
+
step1.push(i,i*2) # 向 step1函数的队列发送消息,入参和手动调用函数那样很相似。
|
|
514
|
+
step1.publish ({'a':i,'b':i*2},task_id=f'task_{i}') # publish 第一个入参是字典,比push能传递更多funboost的辅助参数,类似celery的apply_async和delay的关系。一个简单,一个复杂但强大。
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
"""
|
|
519
|
+
1.funboost 使用 ApsJobAdder.add_push_job来添加定时任务,不是add_job。
|
|
520
|
+
2.funboost是轻度封装的知名apscheduler框架,所以定时任务的语法和apscheduler是一样的,没有自己发明语法和入参
|
|
521
|
+
用户需要苦学apscheduler教程,一切定时都是要学apscheduler知识,定时和funboost知识关系很小。
|
|
522
|
+
3.funboost的定时任务目的是定时推送消息到消息队列中,而不是定时直接在当前程序中执行某个消费函数。
|
|
523
|
+
|
|
524
|
+
下面是三种方式添加定时任务,这些定时方式都是知名apscheduler包的定时方式,和funboost没关系。
|
|
525
|
+
"""
|
|
526
|
+
# 方式1:指定日期执行一次
|
|
527
|
+
ApsJobAdder(step2,
|
|
528
|
+
job_store_kind='redis', # 使用reids作为 apscheduler的 jobstrores
|
|
529
|
+
is_auto_start=True, # 添加任务,并同时顺便启动了定时器 执行了apscheduler对象.start()
|
|
530
|
+
).add_push_job(
|
|
531
|
+
trigger='date',
|
|
532
|
+
run_date='2025-06-30 16:25:40',
|
|
533
|
+
args=(7, 8,9),
|
|
534
|
+
id='date_job1',
|
|
535
|
+
replace_existing=True,
|
|
536
|
+
)
|
|
537
|
+
|
|
538
|
+
# 方式2:固定间隔执行
|
|
539
|
+
ApsJobAdder(step2, job_store_kind='redis').add_push_job(
|
|
540
|
+
trigger='interval',
|
|
541
|
+
seconds=30,
|
|
542
|
+
args=(4, 6,10),
|
|
543
|
+
id='interval_job1',
|
|
544
|
+
replace_existing=True,
|
|
545
|
+
)
|
|
546
|
+
|
|
547
|
+
# 方式3:使用cron表达式定时执行
|
|
548
|
+
ApsJobAdder(step2, job_store_kind='redis').add_push_job(
|
|
549
|
+
trigger='cron',
|
|
550
|
+
day_of_week='*',
|
|
551
|
+
hour=23,
|
|
552
|
+
minute=49,
|
|
553
|
+
second=50,
|
|
554
|
+
kwargs={"c": 50, "d": 60,"e":70},
|
|
555
|
+
replace_existing=True,
|
|
556
|
+
id='cron_job1')
|
|
557
|
+
|
|
558
|
+
ctrl_c_recv() # 用于阻塞代码,阻止主线程退出,使主线程永久运行。 相当于 你在代码最末尾,加了个 while 1:time.sleep(10),使主线程永不结束。apscheduler background定时器守护线程需要这样保持定时器不退出。
|
|
559
|
+
|
|
497
560
|
|
|
498
561
|
```
|
|
499
562
|
|
|
@@ -561,14 +624,17 @@ python比其他语言更需要分布式函数调度框架来执行函数,有
|
|
|
561
624
|
|
|
562
625
|
## 1.6 funboost支持支持celery框架整体作为funboost的broker (2023.4新增)
|
|
563
626
|
```
|
|
564
|
-
见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api
|
|
627
|
+
见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api,
|
|
628
|
+
核心的消费调度和发布和定时功能,都是由celery框架来完成,funboost框架的发布和调度代码不实际起作用。
|
|
565
629
|
用户操作funboost的api,语法和使用其他消息队列中间件类型一样,funboost自动化操作celery。
|
|
566
630
|
|
|
567
631
|
用户无需操作celery本身,无需敲击celery难记的命令行启动消费、定时、flower;
|
|
568
632
|
用户无需小心翼翼纠结亲自使用celery时候怎么规划目录结构 文件夹命名 需要怎么在配置写include 写task_routes,
|
|
569
|
-
完全不存在需要固定的celery
|
|
633
|
+
完全不存在需要固定的celery目录结构,不需要手动配置懵逼的任务路由,
|
|
634
|
+
不需要配置每个函数怎么使用不同的队列名字,funboost自动搞定这些。
|
|
570
635
|
|
|
571
|
-
用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind
|
|
636
|
+
用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind,
|
|
637
|
+
远远的暴击亲自使用无法ide下代码补全的celery框架的语法。
|
|
572
638
|
```
|
|
573
639
|
|
|
574
640
|
```
|
|
@@ -48,7 +48,7 @@ if sys.platform == "darwin": # mac 上会出错
|
|
|
48
48
|
import selectors
|
|
49
49
|
selectors.DefaultSelector = selectors.PollSelector
|
|
50
50
|
|
|
51
|
-
class
|
|
51
|
+
class AsyncPoolExecutor(FunboostFileLoggerMixin,FunboostBaseConcurrentPool):
|
|
52
52
|
"""
|
|
53
53
|
使api和线程池一样,最好的性能做法是submit也弄成 async def,生产和消费在同一个线程同一个loop一起运行,但会对调用链路的兼容性产生破坏,从而调用方式不兼容线程池。
|
|
54
54
|
"""
|
|
@@ -80,8 +80,12 @@ class AsyncPoolExecutorLtPy310(FunboostFileLoggerMixin,FunboostBaseConcurrentPoo
|
|
|
80
80
|
# time.sleep(0.01)
|
|
81
81
|
|
|
82
82
|
def _diff_init(self):
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
if sys.version_info.minor < 10:
|
|
84
|
+
# self._sem = asyncio.Semaphore(self._size, loop=self.loop)
|
|
85
|
+
self._queue = asyncio.Queue(maxsize=self._size, loop=self.loop)
|
|
86
|
+
else:
|
|
87
|
+
# self._sem = asyncio.Semaphore(self._size) # python3.10后,很多类和方法都删除了loop传参
|
|
88
|
+
self._queue = asyncio.Queue(maxsize=self._size)
|
|
85
89
|
|
|
86
90
|
|
|
87
91
|
def submit(self, func, *args, **kwargs):
|
|
@@ -101,7 +105,7 @@ class AsyncPoolExecutorLtPy310(FunboostFileLoggerMixin,FunboostBaseConcurrentPoo
|
|
|
101
105
|
try:
|
|
102
106
|
await func(*args, **kwargs)
|
|
103
107
|
except BaseException as e:
|
|
104
|
-
traceback.
|
|
108
|
+
self.logger.exception(f'func:{func}, args:{args}, kwargs:{kwargs} exc_type:{type(e)} traceback_exc:{traceback.format_exc()}')
|
|
105
109
|
# self._queue.task_done()
|
|
106
110
|
|
|
107
111
|
async def __run(self):
|
|
@@ -135,17 +139,11 @@ class AsyncPoolExecutorLtPy310(FunboostFileLoggerMixin,FunboostBaseConcurrentPoo
|
|
|
135
139
|
|
|
136
140
|
|
|
137
141
|
|
|
138
|
-
class AsyncPoolExecutorGtPy310(AsyncPoolExecutorLtPy310):
|
|
139
|
-
|
|
140
|
-
def _diff_init(self):
|
|
141
|
-
self._sem = asyncio.Semaphore(self._size, ) # python3.10后,很多类和方法都删除了loop传参
|
|
142
|
-
self._queue = asyncio.Queue(maxsize=self._size, )
|
|
143
142
|
|
|
144
143
|
|
|
145
144
|
|
|
146
145
|
|
|
147
146
|
|
|
148
|
-
AsyncPoolExecutor = AsyncPoolExecutorLtPy310 if sys.version_info.minor < 10 else AsyncPoolExecutorGtPy310
|
|
149
147
|
|
|
150
148
|
|
|
151
149
|
|
|
@@ -22,12 +22,12 @@ class RocketmqConsumer(AbstractConsumer):
|
|
|
22
22
|
except BaseException as e:
|
|
23
23
|
# print(traceback.format_exc())
|
|
24
24
|
raise ImportError(f'rocketmq包 只支持linux和mac {e}')
|
|
25
|
-
consumer = PushConsumer(self.GROUP_ID)
|
|
25
|
+
consumer = PushConsumer(f'{self.GROUP_ID}_{self._queue_name}')
|
|
26
26
|
consumer.set_namesrv_addr(BrokerConnConfig.ROCKETMQ_NAMESRV_ADDR)
|
|
27
27
|
consumer.set_thread_count(1)
|
|
28
28
|
consumer.set_message_batch_max_size(self.consumer_params.concurrent_num)
|
|
29
29
|
|
|
30
|
-
self._publisher = RocketmqPublisher(publisher_params=PublisherParams(queue_name=self._queue_name))
|
|
30
|
+
self._publisher = RocketmqPublisher(publisher_params=PublisherParams(queue_name=self._queue_name,))
|
|
31
31
|
|
|
32
32
|
def callback(rocketmq_msg):
|
|
33
33
|
# self.logger.debug(f'从rocketmq的 [{self._queue_name}] 主题的queue_id {rocketmq_msg.queue_id} 中 取出的消息是:{rocketmq_msg.body}')
|
|
@@ -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比最大支持的优先级还高。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version: 49.
|
|
3
|
+
Version: 49.3
|
|
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
|
|
@@ -73,8 +73,10 @@ Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”
|
|
|
73
73
|
框架对代码没有入侵,可以加到任意已有项目而对项目python文件目录结构0要求,
|
|
74
74
|
不像 celery django scrapy 这样的框架,要从一开始就开始规划好项目目录结构,如果不想用框架了,
|
|
75
75
|
或者想改变使用其他框架框架,那么已经所写的代码组织形式就几乎成了废物,需要大改特改.
|
|
76
|
-
但是funboost
|
|
76
|
+
但是funboost完全不会这样,就算是加上或去掉@boost装饰器,对你的项目影响为0,用户照常使用,
|
|
77
77
|
所以用户可以对任意项目,任意时候,引入使用funboost或者去掉使用funboost,代码组织形式不需要发生变化.
|
|
78
|
+
(即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数有@boost装饰器对函数自身的直接调用运行没有任何影响,
|
|
79
|
+
用户照样可以直接例如 fun(x,y)是直接运行函数 , fun.push(x,y) 才是发送到消息队列)
|
|
78
80
|
|
|
79
81
|
通过funboost web manager 管理系统,支持全面 查看 监控 管理 funboost的任务消费。
|
|
80
82
|
</pre>
|
|
@@ -486,26 +488,32 @@ if __name__ == "__main__":
|
|
|
486
488
|
|
|
487
489
|
|
|
488
490
|
|
|
489
|
-
## 1.3.2 funboost
|
|
491
|
+
## 1.3.2 funboost集中演示一个功能更多的综合例子
|
|
490
492
|
|
|
491
493
|
```python
|
|
492
494
|
|
|
495
|
+
|
|
493
496
|
"""
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
497
|
+
一个展示更全面 funboost 用法的例子
|
|
498
|
+
包含了
|
|
499
|
+
1.继承BoosterParams,为了每个装饰器少写入参
|
|
500
|
+
2.rpc获取结果
|
|
501
|
+
3.连续丝滑启动多个消费函数
|
|
502
|
+
4.定时任务
|
|
498
503
|
"""
|
|
499
|
-
from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum
|
|
504
|
+
from funboost import boost, BrokerEnum,BoosterParams,ctrl_c_recv,ConcurrentModeEnum,ApsJobAdder
|
|
500
505
|
import time
|
|
501
506
|
|
|
502
507
|
class MyBoosterParams(BoosterParams): # 自定义的参数类,继承BoosterParams,用于减少每个消费函数装饰器的重复相同入参个数
|
|
503
|
-
broker_kind: str = BrokerEnum.
|
|
508
|
+
broker_kind: str = BrokerEnum.REDIS_ACK_ABLE
|
|
504
509
|
max_retry_times: int = 3
|
|
505
510
|
concurrent_mode: str = ConcurrentModeEnum.THREADING
|
|
506
511
|
|
|
507
512
|
|
|
508
|
-
@boost(MyBoosterParams(queue_name='s1_queue', qps=1,
|
|
513
|
+
@boost(MyBoosterParams(queue_name='s1_queue', qps=1,
|
|
514
|
+
# do_task_filtering=True, # 可开启任务过滤,防止重复入参消费。
|
|
515
|
+
is_using_rpc_mode=True, # 开启rpc模式,支持rpc获取结果
|
|
516
|
+
))
|
|
509
517
|
def step1(a:int,b:int):
|
|
510
518
|
print(f'a={a},b={b}')
|
|
511
519
|
time.sleep(0.7)
|
|
@@ -514,20 +522,75 @@ def step1(a:int,b:int):
|
|
|
514
522
|
return a+b
|
|
515
523
|
|
|
516
524
|
|
|
517
|
-
@boost(MyBoosterParams(queue_name='s2_queue', qps=3,
|
|
518
|
-
|
|
525
|
+
@boost(MyBoosterParams(queue_name='s2_queue', qps=3,
|
|
526
|
+
max_retry_times=5,# 可以在此覆盖MyBoosterParams中的默认值,例如为step2单独设置最大重试次数为5
|
|
527
|
+
))
|
|
528
|
+
def step2(c:int,d:int,e:int=666):
|
|
519
529
|
time.sleep(3)
|
|
520
530
|
print(f'c={c},d={d},e={e}')
|
|
521
531
|
return c* d * e
|
|
522
532
|
|
|
523
533
|
|
|
524
534
|
if __name__ == '__main__':
|
|
525
|
-
|
|
526
|
-
|
|
535
|
+
step1.clear() # 清空队列
|
|
536
|
+
step2.clear() # 清空队列
|
|
537
|
+
|
|
527
538
|
step1.consume() # 调用.consume是非阻塞的启动消费,是在单独的子线程中循环拉取消息的。
|
|
528
539
|
# 有的人还担心阻塞而手动使用 threading.Thread(target=step1.consume).start() 来启动消费,这是完全多此一举的错误写法。
|
|
529
|
-
step2.consume() #
|
|
530
|
-
|
|
540
|
+
step2.consume() # 所以可以在当前主线程连续无阻塞丝滑的启动多个函数消费。
|
|
541
|
+
step2.multi_process_consume(3) # 这是多进程叠加了多线程消费,另外开启了3个进程,叠加了默认的线程并发。
|
|
542
|
+
|
|
543
|
+
async_result = step1.push(100,b=200)
|
|
544
|
+
print('step1的rpc结果是:',async_result.result) # rpc阻塞等待消step1的费结果返回
|
|
545
|
+
|
|
546
|
+
for i in range(100):
|
|
547
|
+
step1.push(i,i*2) # 向 step1函数的队列发送消息,入参和手动调用函数那样很相似。
|
|
548
|
+
step1.publish ({'a':i,'b':i*2},task_id=f'task_{i}') # publish 第一个入参是字典,比push能传递更多funboost的辅助参数,类似celery的apply_async和delay的关系。一个简单,一个复杂但强大。
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
"""
|
|
553
|
+
1.funboost 使用 ApsJobAdder.add_push_job来添加定时任务,不是add_job。
|
|
554
|
+
2.funboost是轻度封装的知名apscheduler框架,所以定时任务的语法和apscheduler是一样的,没有自己发明语法和入参
|
|
555
|
+
用户需要苦学apscheduler教程,一切定时都是要学apscheduler知识,定时和funboost知识关系很小。
|
|
556
|
+
3.funboost的定时任务目的是定时推送消息到消息队列中,而不是定时直接在当前程序中执行某个消费函数。
|
|
557
|
+
|
|
558
|
+
下面是三种方式添加定时任务,这些定时方式都是知名apscheduler包的定时方式,和funboost没关系。
|
|
559
|
+
"""
|
|
560
|
+
# 方式1:指定日期执行一次
|
|
561
|
+
ApsJobAdder(step2,
|
|
562
|
+
job_store_kind='redis', # 使用reids作为 apscheduler的 jobstrores
|
|
563
|
+
is_auto_start=True, # 添加任务,并同时顺便启动了定时器 执行了apscheduler对象.start()
|
|
564
|
+
).add_push_job(
|
|
565
|
+
trigger='date',
|
|
566
|
+
run_date='2025-06-30 16:25:40',
|
|
567
|
+
args=(7, 8,9),
|
|
568
|
+
id='date_job1',
|
|
569
|
+
replace_existing=True,
|
|
570
|
+
)
|
|
571
|
+
|
|
572
|
+
# 方式2:固定间隔执行
|
|
573
|
+
ApsJobAdder(step2, job_store_kind='redis').add_push_job(
|
|
574
|
+
trigger='interval',
|
|
575
|
+
seconds=30,
|
|
576
|
+
args=(4, 6,10),
|
|
577
|
+
id='interval_job1',
|
|
578
|
+
replace_existing=True,
|
|
579
|
+
)
|
|
580
|
+
|
|
581
|
+
# 方式3:使用cron表达式定时执行
|
|
582
|
+
ApsJobAdder(step2, job_store_kind='redis').add_push_job(
|
|
583
|
+
trigger='cron',
|
|
584
|
+
day_of_week='*',
|
|
585
|
+
hour=23,
|
|
586
|
+
minute=49,
|
|
587
|
+
second=50,
|
|
588
|
+
kwargs={"c": 50, "d": 60,"e":70},
|
|
589
|
+
replace_existing=True,
|
|
590
|
+
id='cron_job1')
|
|
591
|
+
|
|
592
|
+
ctrl_c_recv() # 用于阻塞代码,阻止主线程退出,使主线程永久运行。 相当于 你在代码最末尾,加了个 while 1:time.sleep(10),使主线程永不结束。apscheduler background定时器守护线程需要这样保持定时器不退出。
|
|
593
|
+
|
|
531
594
|
|
|
532
595
|
```
|
|
533
596
|
|
|
@@ -595,14 +658,17 @@ python比其他语言更需要分布式函数调度框架来执行函数,有
|
|
|
595
658
|
|
|
596
659
|
## 1.6 funboost支持支持celery框架整体作为funboost的broker (2023.4新增)
|
|
597
660
|
```
|
|
598
|
-
见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api
|
|
661
|
+
见11.1章节代码例子,celery框架整体作为funboost的broker,funboost的发布和消费将只作为极简api,
|
|
662
|
+
核心的消费调度和发布和定时功能,都是由celery框架来完成,funboost框架的发布和调度代码不实际起作用。
|
|
599
663
|
用户操作funboost的api,语法和使用其他消息队列中间件类型一样,funboost自动化操作celery。
|
|
600
664
|
|
|
601
665
|
用户无需操作celery本身,无需敲击celery难记的命令行启动消费、定时、flower;
|
|
602
666
|
用户无需小心翼翼纠结亲自使用celery时候怎么规划目录结构 文件夹命名 需要怎么在配置写include 写task_routes,
|
|
603
|
-
完全不存在需要固定的celery
|
|
667
|
+
完全不存在需要固定的celery目录结构,不需要手动配置懵逼的任务路由,
|
|
668
|
+
不需要配置每个函数怎么使用不同的队列名字,funboost自动搞定这些。
|
|
604
669
|
|
|
605
|
-
用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind
|
|
670
|
+
用户只需要使用简单的funboost语法就能操控celery框架了。funboost使用celery作为broker_kind,
|
|
671
|
+
远远的暴击亲自使用无法ide下代码补全的celery框架的语法。
|
|
606
672
|
```
|
|
607
673
|
|
|
608
674
|
```
|
|
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-49.2 → funboost-49.3}/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
|
{funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/backup/async_pool_executor_janus.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-49.2 → funboost-49.3}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|