funboost 49.8__tar.gz → 50.0__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.8/funboost.egg-info → funboost-50.0}/PKG-INFO +69 -33
- {funboost-49.8 → funboost-50.0}/README.md +60 -32
- {funboost-49.8 → funboost-50.0}/funboost/__init__.py +1 -1
- {funboost-49.8 → funboost-50.0}/funboost/assist/celery_helper.py +1 -1
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/async_pool_executor.py +7 -2
- {funboost-49.8 → funboost-50.0}/funboost/constant.py +23 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/base_consumer.py +12 -7
- funboost-50.0/funboost/consumers/grpc_consumer.py +102 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/kafka_consumer.py +4 -2
- {funboost-49.8 → funboost-50.0}/funboost/consumers/kafka_consumer_manually_commit.py +7 -2
- funboost-50.0/funboost/consumers/mysql_cdc_consumer.py +95 -0
- funboost-50.0/funboost/contrib/cdc/mysql2mysql.py +44 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/booster.py +25 -2
- {funboost-49.8 → funboost-50.0}/funboost/core/exceptions.py +3 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/func_params_model.py +6 -5
- {funboost-49.8 → funboost-50.0}/funboost/core/msg_result_getter.py +8 -7
- {funboost-49.8 → funboost-50.0}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +10 -1
- {funboost-49.8 → funboost-50.0}/funboost/publishers/base_publisher.py +5 -6
- funboost-50.0/funboost/publishers/grpc_publisher.py +53 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/kafka_publisher.py +3 -1
- funboost-50.0/funboost/publishers/mysql_cdc_publisher.py +24 -0
- {funboost-49.8 → funboost-50.0}/funboost/timing_job/timing_push.py +3 -1
- funboost-50.0/funboost/utils/func_timeout/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0/funboost.egg-info}/PKG-INFO +69 -33
- {funboost-49.8 → funboost-50.0}/funboost.egg-info/SOURCES.txt +7 -10
- {funboost-49.8 → funboost-50.0}/funboost.egg-info/requires.txt +8 -0
- {funboost-49.8 → funboost-50.0}/setup.py +6 -0
- funboost-49.8/funboost/utils/class_utils2.py +0 -94
- funboost-49.8/funboost/utils/custom_pysnooper.py +0 -149
- funboost-49.8/funboost/utils/pysnooper_ydf/__init__.py +0 -32
- funboost-49.8/funboost/utils/pysnooper_ydf/pycompat.py +0 -82
- funboost-49.8/funboost/utils/pysnooper_ydf/tracer.py +0 -479
- funboost-49.8/funboost/utils/pysnooper_ydf/utils.py +0 -101
- funboost-49.8/funboost/utils/pysnooper_ydf/variables.py +0 -133
- funboost-49.8/funboost/utils/times/__init__.py +0 -85
- funboost-49.8/funboost/utils/times/version.py +0 -1
- {funboost-49.8 → funboost-50.0}/LICENSE +0 -0
- {funboost-49.8 → funboost-50.0}/MANIFEST.in +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/__init__old.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/__main__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/assist/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/assist/dramatiq_helper.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/assist/faststream_helper.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/assist/huey_helper.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/assist/rocketry_helper.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/assist/rq_helper.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/assist/rq_windows_worker.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/assist/taskiq_helper.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/beggar_version_implementation/beggar_redis_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/async_helper.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/backup/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/backup/grok_async_pool.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/base_pool_type.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/pool_commons.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/concurrent_pool/single_thread_executor.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/celery_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/confirm_mixin.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/dramatiq_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/empty_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/faststream_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/http_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/http_consumer000.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/httpsqs_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/huey_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/kombu_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/local_python_queue_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/memory_deque_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/mongomq_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/mqtt_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/nameko_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/nats_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/nsq_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/peewee_conusmer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/persist_queue_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/pulsar_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/redis_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/redis_consumer_ack_able.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/redis_consumer_priority.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/redis_consumer_simple.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/redis_filter.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/redis_pubsub_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/redis_stream_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/rocketmq_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/rq_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/sqlachemy_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/tcp_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/txt_file_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/udp_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/consumers/zeromq_consumer.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/contrib/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/contrib/api_publish_msg.py +0 -0
- {funboost-49.8/funboost/core → funboost-50.0/funboost/contrib/cdc}/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/contrib/django_db_deco.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/contrib/queue2queue.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
- {funboost-49.8/funboost/core/cli → funboost-50.0/funboost/core}/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/active_cousumer_info_getter.py +0 -0
- {funboost-49.8/funboost/queues → funboost-50.0/funboost/core/cli}/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/cli/discovery_boosters.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/cli/funboost_fire.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/current_task.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/fabric_deploy_helper.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/funboost_config_getter.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/funboost_time.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/function_result_status_config.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/function_result_status_saver.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/helper_funs.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/kill_remote_task.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/lazy_impoter.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/loggers.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/muliti_process_enhance.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/serialization.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/core/task_id_logger.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/factories/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/factories/consumer_factory.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/factories/publisher_factotry.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/funboost_config_deafult.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/__pycache__/app.cpython-313.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/__pycache__/app.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/__pycache__/functions.cpython-313.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/app.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/app_debug_start.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/functions.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/assets/css/custom.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/assets/js/custom.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css/content_page_style.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css/style.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/css/font-awesome.min.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/FontAwesome.otf +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.eot +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.svg +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2 +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/select2/4.0.13/css/select2.min.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator.min.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator_bootstrap3.min.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/css/bootstrap.min.css +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.eot +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.svg +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.ttf +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff2 +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/images/bg.jpg +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/images/favicon.ico +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/images/password.png +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/images/tick.png +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/images/user.png +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/js/bootstrap-datetimepicker.min.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/js/echarts.min.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/js/form-memory.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/js/moment-with-locales.min.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/js/select2.min.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/js_cdn/bootstrap/3.3.7/js/bootstrap.min.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/js_cdn/chart.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/static/js_cdn/tabulator-tables@5.5.0/dist/js/tabulator.min.js +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/about.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/conusme_speed.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/fun_result_table.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/index.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/index_backup.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/login.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/queue_op.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/rpc_call.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/running_consumer_by_ip.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/function_result_web/templates/running_consumer_by_queue_name.html +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/celery_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/celery_publisher000.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/confluent_kafka_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/dramatiq_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/empty_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/faststream_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/http_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/httpsqs_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/huey_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/kombu_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/local_python_queue_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/meomory_deque_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/mongomq_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/mqtt_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/nameko_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/nats_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/nsq_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/peewee_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/persist_queue_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/pulsar_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/redis_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/redis_publisher_lpush.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/redis_publisher_priority.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/redis_publisher_simple.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/redis_pubsub_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/redis_stream_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/rocketmq_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/rq_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/sqla_queue_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/tcp_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/txt_file_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/udp_publisher.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/publishers/zeromq_publisher.py +0 -0
- {funboost-49.8/funboost/utils/dependency_packages → funboost-50.0/funboost/queues}/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/queues/memory_queues_map.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/queues/peewee_queue.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/queues/sqla_queue.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/set_frame_config.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/timing_job/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/timing_job/apscheduler_use_redis_store.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/timing_job/timing_job_base.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/apscheduler_monkey.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/block_exit.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/bulk_operation.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/class_utils.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/ctrl_c_end.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/decorators.py +0 -0
- {funboost-49.8/funboost/utils/dependency_packages_in_pythonpath → funboost-50.0/funboost/utils/dependency_packages}/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
- {funboost-49.8/funboost/utils/func_timeout → funboost-50.0/funboost/utils/dependency_packages_in_pythonpath}/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-313.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-313.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/develop_log.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/expire_lock.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/func_timeout/StoppableThread.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/func_timeout/dafunc.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/func_timeout/exceptions.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/func_timeout/py2_raise.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/func_timeout/py3_raise.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/json_helper.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/mongo_util.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/monkey_color_log.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/monkey_patches.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/mqtt_util.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/paramiko_util.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/rabbitmq_factory.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/redis_manager.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/redis_manager_old.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/resource_monitoring.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/restart_python.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/simple_data_class.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/str_utils.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/time_util.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost/utils/un_strict_json_dumps.py +0 -0
- {funboost-49.8 → funboost-50.0}/funboost.egg-info/dependency_links.txt +0 -0
- {funboost-49.8 → funboost-50.0}/funboost.egg-info/entry_points.txt +0 -0
- {funboost-49.8 → funboost-50.0}/funboost.egg-info/top_level.txt +0 -0
- {funboost-49.8 → funboost-50.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version:
|
|
3
|
+
Version: 50.0
|
|
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
|
|
@@ -83,6 +83,10 @@ Requires-Dist: pyzmq; extra == "all"
|
|
|
83
83
|
Requires-Dist: kafka-python==2.0.2; extra == "all"
|
|
84
84
|
Requires-Dist: eventlet==0.33.3; extra == "all"
|
|
85
85
|
Requires-Dist: gevent==22.10.2; extra == "all"
|
|
86
|
+
Requires-Dist: mysql-replication==1.0.9; extra == "all"
|
|
87
|
+
Requires-Dist: grpcio==1.60.0; extra == "all"
|
|
88
|
+
Requires-Dist: grpcio-tools==1.60.0; extra == "all"
|
|
89
|
+
Requires-Dist: protobuf==4.25.1; extra == "all"
|
|
86
90
|
Requires-Dist: flask; extra == "all"
|
|
87
91
|
Requires-Dist: flask_bootstrap; extra == "all"
|
|
88
92
|
Requires-Dist: flask_wtf; extra == "all"
|
|
@@ -113,6 +117,10 @@ Requires-Dist: pyzmq; extra == "extra-brokers"
|
|
|
113
117
|
Requires-Dist: kafka-python==2.0.2; extra == "extra-brokers"
|
|
114
118
|
Requires-Dist: eventlet==0.33.3; extra == "extra-brokers"
|
|
115
119
|
Requires-Dist: gevent==22.10.2; extra == "extra-brokers"
|
|
120
|
+
Requires-Dist: mysql-replication==1.0.9; extra == "extra-brokers"
|
|
121
|
+
Requires-Dist: grpcio==1.60.0; extra == "extra-brokers"
|
|
122
|
+
Requires-Dist: grpcio-tools==1.60.0; extra == "extra-brokers"
|
|
123
|
+
Requires-Dist: protobuf==4.25.1; extra == "extra-brokers"
|
|
116
124
|
Provides-Extra: flask
|
|
117
125
|
Requires-Dist: flask; extra == "flask"
|
|
118
126
|
Requires-Dist: flask_bootstrap; extra == "flask"
|
|
@@ -182,45 +190,65 @@ funboost的旧框架名字是function_scheduling_distributed_framework , 关系
|
|
|
182
190
|
|
|
183
191
|
## 1.0 github地址和文档地址
|
|
184
192
|
|
|
185
|
-
### 1.0.1
|
|
193
|
+
### 1.0.1 分布式函数调度框架文档地址
|
|
186
194
|
|
|
187
195
|
[查看分布式函数调度框架文档 https://funboost.readthedocs.io/zh-cn/latest/index.html](https://funboost.readthedocs.io/zh-cn/latest/index.html)
|
|
188
196
|
|
|
189
|
-
|
|
197
|
+
文档很长,大部分都是讲原理和对比各种框架,不仅仅 `how` to use,更多的是 `What` & `Why`。
|
|
198
|
+
但是用户只需要学习1.3这1个例子就能掌握了。因为其他例子只是 @boost的 BoosterParams 里面的控制入参换了一下。
|
|
199
|
+
|
|
190
200
|
|
|
191
201
|
用户只需要专门看 BoosterParams 里面的每个入参的注释就能掌握框架了,因为funboost只有@boost一行代码需要你写。
|
|
192
202
|
|
|
193
203
|
funboost 框架和一般的框架不一样,因为只有一行代码需要掌握,绝对不是要求用户先精通框架本身才能自由发挥。
|
|
194
204
|
|
|
195
|
-
#### [1.python万能分布式函数调度框架简funboost简介](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
|
|
196
|
-
|
|
197
|
-
#### [2. funboost对比celery框架](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
|
|
198
|
-
|
|
199
|
-
#### [3.funboost框架详细介绍](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
|
|
200
|
-
|
|
201
|
-
#### [4.funboost使用框架的各种代码示例](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
|
|
202
|
-
|
|
203
|
-
#### [4b.funboost使用框架的各种代码示例(高级进阶)](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
|
|
204
|
-
|
|
205
|
-
#### [5.funboost框架运行时截图](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
|
|
206
|
-
|
|
207
|
-
#### [6.funboost常见问题回答](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
|
|
208
|
-
|
|
209
|
-
#### [7.funboost更新记录](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
|
|
210
|
-
|
|
211
|
-
#### [8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
|
|
212
205
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
206
|
+
[**1.python万能分布式函数调度框架简funboost简介**](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
|
|
207
|
+
|
|
208
|
+
##### 2. funboost对比celery框架
|
|
209
|
+
[**2.funboost对比celery框架**](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
|
|
210
|
+
[2.funboost对比celery框架](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
|
|
211
|
+
[**3.funboost框架详细介绍**](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
|
|
212
|
+
##### 3.funboost框架详细介绍
|
|
213
|
+
[**4.funboost使用框架的各种代码示例**](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
|
|
214
|
+
[3.funboost框架详细介绍](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
|
|
215
|
+
[**4b.funboost使用框架的各种代码示例(高级进阶)**](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
|
|
216
|
+
##### 4.funboost使用框架的各种代码示例
|
|
217
|
+
[4.funboost使用框架的各种代码示例](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
|
|
218
|
+
[**5.funboost框架运行时截图**](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
|
|
219
|
+
##### 4b.funboost使用框架的各种代码示例(高级进阶)
|
|
220
|
+
[4b.funboost使用框架的各种代码示例(高级进阶)](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
|
|
221
|
+
[**6.funboost常见问题回答**](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
|
|
222
|
+
##### 5.funboost框架运行时截图
|
|
223
|
+
[5.funboost框架运行时截图](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
|
|
224
|
+
[**7.funboost更新记录**](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
|
|
225
|
+
##### 6.funboost常见问题回答
|
|
226
|
+
[6.funboost常见问题回答](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
|
|
227
|
+
[**8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役**](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
|
|
228
|
+
##### 7.funboost更新记录
|
|
229
|
+
[7.funboost更新记录](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
|
|
230
|
+
[**9.轻松远程服务器部署运行函数**](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
|
|
231
|
+
##### 8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役
|
|
232
|
+
[8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
|
|
233
|
+
[**10.python3.6-3.12 安装/使用funboost出错问题反馈**](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
|
|
234
|
+
##### 9.轻松远程服务器部署运行函数
|
|
235
|
+
[9.轻松远程服务器部署运行函数](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
|
|
236
|
+
[**11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。**](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
|
|
237
|
+
##### 10.python3.6-3.12 安装/使用funboost出错问题反馈
|
|
238
|
+
[10.python3.6-3.12 安装/使用funboost出错问题反馈](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
|
|
239
|
+
[**12.funboost 控制台支持命令行**](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
|
|
240
|
+
##### 11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。
|
|
241
|
+
[11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
|
|
242
|
+
[**13.启动 funboost web manager,查看消费结果和队列管理**](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
|
|
243
|
+
##### 12.funboost 控制台支持命令行
|
|
244
|
+
[12.funboost 控制台支持命令行](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
|
|
245
|
+
|
|
246
|
+
##### 13.启动 funboost web manager,查看消费结果和队列管理
|
|
247
|
+
[13.启动 funboost web manager,查看消费结果和队列管理](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
#### funboost依赖的nb_log日志文档
|
|
251
|
+
[funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
|
|
224
252
|
|
|
225
253
|
```
|
|
226
254
|
文档很长,但归根结底只需要学习 1.3 里面的这1个例子就行,主要是修改下@boost的各种参数,
|
|
@@ -234,7 +262,7 @@ funboost 框架和一般的框架不一样,因为只有一行代码需要掌
|
|
|
234
262
|
很多新手需要小心翼翼模仿网上说的项目目录结构,以为不按照那么规划目录和命名就玩不起来,本身说明celery很坑。
|
|
235
263
|
```
|
|
236
264
|
|
|
237
|
-
### 1.0.2
|
|
265
|
+
### 1.0.2 分布式函数调度框架github地址
|
|
238
266
|
|
|
239
267
|
[查看分布式函数调度框架github项目](https://github.com/ydf0509/funboost)
|
|
240
268
|
|
|
@@ -489,8 +517,14 @@ win cmd和linux 运行时候,设置 PYTHONPATH 为项目根目录,是为了
|
|
|
489
517
|
而是根据实际情况函数的参数个数、函数的内部逻辑功能,全部都由用户自定义,函数里面想写什么就写什么,想干什么就干什么,极端自由。
|
|
490
518
|
也就是框架很容易学和使用,把下面的task_fun函数的入参和内部逻辑换成你自己想写的函数功能就可以了,框架只需要学习boost这一个函数的参数就行。
|
|
491
519
|
测试使用的时候函数里面加上sleep模拟阻塞,从而更好的了解框架的并发和各种控制功能。
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
```
|
|
523
|
+
有一点要说明的是框架的消息中间件的ip 端口 密码 等配置是在你第一次运行代码时候,在你当前项目的根目录下生成的 funboost_config.py 按需设置 (默认放在项目根目录是为了方便利用项目的 PYTHONPATH。当然,只要 PYTHONPATH 设置正确,
|
|
524
|
+
该配置文件可以放在磁盘的任意文件夹里面。用户可以看教程 6.18.3 问答章节)。
|
|
492
525
|
|
|
493
|
-
|
|
526
|
+
funboost_config.py 里面仅仅是配置 中间件连接,例如ip 端口这些简单的配置, 只需要第一次配置正确即可,
|
|
527
|
+
后续的开发中基本无需再次修改此文件。 因为所有消费函数任务控制功能都是在 BoosterParams 中传参。
|
|
494
528
|
```
|
|
495
529
|
|
|
496
530
|
### 1.3.1 funboost最简单例子
|
|
@@ -686,7 +720,9 @@ def task_fun(a: int, b: int):
|
|
|
686
720
|
队列操作,查看消费者详情:查看队列的所有消费者详情
|
|
687
721
|
[](https://imgse.com/i/pEJCgT1)
|
|
688
722
|
|
|
723
|
+
|
|
689
724
|
队列操作:查看消费曲线图,查看各种消费指标。
|
|
725
|
+
包括 历史运行次数 历史运行失败次数 近10秒完成 近10秒失败 近10秒函数运行平均耗时 累计函数运行平均耗时 剩余消息数量
|
|
690
726
|
[](https://imgse.com/i/pVpr7sP)
|
|
691
727
|
|
|
692
728
|
rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;根据taskid获取结果。
|
|
@@ -60,45 +60,65 @@ funboost的旧框架名字是function_scheduling_distributed_framework , 关系
|
|
|
60
60
|
|
|
61
61
|
## 1.0 github地址和文档地址
|
|
62
62
|
|
|
63
|
-
### 1.0.1
|
|
63
|
+
### 1.0.1 分布式函数调度框架文档地址
|
|
64
64
|
|
|
65
65
|
[查看分布式函数调度框架文档 https://funboost.readthedocs.io/zh-cn/latest/index.html](https://funboost.readthedocs.io/zh-cn/latest/index.html)
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
文档很长,大部分都是讲原理和对比各种框架,不仅仅 `how` to use,更多的是 `What` & `Why`。
|
|
68
|
+
但是用户只需要学习1.3这1个例子就能掌握了。因为其他例子只是 @boost的 BoosterParams 里面的控制入参换了一下。
|
|
69
|
+
|
|
68
70
|
|
|
69
71
|
用户只需要专门看 BoosterParams 里面的每个入参的注释就能掌握框架了,因为funboost只有@boost一行代码需要你写。
|
|
70
72
|
|
|
71
73
|
funboost 框架和一般的框架不一样,因为只有一行代码需要掌握,绝对不是要求用户先精通框架本身才能自由发挥。
|
|
72
74
|
|
|
73
|
-
#### [1.python万能分布式函数调度框架简funboost简介](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
|
|
74
|
-
|
|
75
|
-
#### [2. funboost对比celery框架](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
|
|
76
|
-
|
|
77
|
-
#### [3.funboost框架详细介绍](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
|
|
78
|
-
|
|
79
|
-
#### [4.funboost使用框架的各种代码示例](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
|
|
80
|
-
|
|
81
|
-
#### [4b.funboost使用框架的各种代码示例(高级进阶)](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
|
|
82
|
-
|
|
83
|
-
#### [5.funboost框架运行时截图](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
|
|
84
|
-
|
|
85
|
-
#### [6.funboost常见问题回答](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
|
|
86
|
-
|
|
87
|
-
#### [7.funboost更新记录](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
|
|
88
|
-
|
|
89
|
-
#### [8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
|
|
90
75
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
76
|
+
[**1.python万能分布式函数调度框架简funboost简介**](https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html)
|
|
77
|
+
|
|
78
|
+
##### 2. funboost对比celery框架
|
|
79
|
+
[**2.funboost对比celery框架**](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
|
|
80
|
+
[2.funboost对比celery框架](https://funboost.readthedocs.io/zh-cn/latest/articles/c2.html)
|
|
81
|
+
[**3.funboost框架详细介绍**](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
|
|
82
|
+
##### 3.funboost框架详细介绍
|
|
83
|
+
[**4.funboost使用框架的各种代码示例**](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
|
|
84
|
+
[3.funboost框架详细介绍](https://funboost.readthedocs.io/zh-cn/latest/articles/c3.html)
|
|
85
|
+
[**4b.funboost使用框架的各种代码示例(高级进阶)**](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
|
|
86
|
+
##### 4.funboost使用框架的各种代码示例
|
|
87
|
+
[4.funboost使用框架的各种代码示例](https://funboost.readthedocs.io/zh-cn/latest/articles/c4.html)
|
|
88
|
+
[**5.funboost框架运行时截图**](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
|
|
89
|
+
##### 4b.funboost使用框架的各种代码示例(高级进阶)
|
|
90
|
+
[4b.funboost使用框架的各种代码示例(高级进阶)](https://funboost.readthedocs.io/zh-cn/latest/articles/c4b.html)
|
|
91
|
+
[**6.funboost常见问题回答**](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
|
|
92
|
+
##### 5.funboost框架运行时截图
|
|
93
|
+
[5.funboost框架运行时截图](https://funboost.readthedocs.io/zh-cn/latest/articles/c5.html)
|
|
94
|
+
[**7.funboost更新记录**](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
|
|
95
|
+
##### 6.funboost常见问题回答
|
|
96
|
+
[6.funboost常见问题回答](https://funboost.readthedocs.io/zh-cn/latest/articles/c6.html)
|
|
97
|
+
[**8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役**](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
|
|
98
|
+
##### 7.funboost更新记录
|
|
99
|
+
[7.funboost更新记录](https://funboost.readthedocs.io/zh-cn/latest/articles/c7.html)
|
|
100
|
+
[**9.轻松远程服务器部署运行函数**](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
|
|
101
|
+
##### 8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役
|
|
102
|
+
[8.funboost是万能函数调度框架,当然可以爬虫,自由编程 降维打击 框架奴役](https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html)
|
|
103
|
+
[**10.python3.6-3.12 安装/使用funboost出错问题反馈**](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
|
|
104
|
+
##### 9.轻松远程服务器部署运行函数
|
|
105
|
+
[9.轻松远程服务器部署运行函数](https://funboost.readthedocs.io/zh-cn/latest/articles/c9.html#)
|
|
106
|
+
[**11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。**](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
|
|
107
|
+
##### 10.python3.6-3.12 安装/使用funboost出错问题反馈
|
|
108
|
+
[10.python3.6-3.12 安装/使用funboost出错问题反馈](https://funboost.readthedocs.io/zh-cn/latest/articles/c10.html)
|
|
109
|
+
[**12.funboost 控制台支持命令行**](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
|
|
110
|
+
##### 11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。
|
|
111
|
+
[11.funboost 使用某些中间件或三方任务队列框架作为broker的例子(包括celery框架)。](https://funboost.readthedocs.io/zh-cn/latest/articles/c11.html)
|
|
112
|
+
[**13.启动 funboost web manager,查看消费结果和队列管理**](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
|
|
113
|
+
##### 12.funboost 控制台支持命令行
|
|
114
|
+
[12.funboost 控制台支持命令行](https://funboost.readthedocs.io/zh-cn/latest/articles/c12.html)
|
|
115
|
+
|
|
116
|
+
##### 13.启动 funboost web manager,查看消费结果和队列管理
|
|
117
|
+
[13.启动 funboost web manager,查看消费结果和队列管理](https://funboost.readthedocs.io/zh-cn/latest/articles/c13.html)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
#### funboost依赖的nb_log日志文档
|
|
121
|
+
[funboost依赖的nb_log日志文档 https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2](https://nb-log-doc.readthedocs.io/zh_CN/latest/articles/c9.html#id2)
|
|
102
122
|
|
|
103
123
|
```
|
|
104
124
|
文档很长,但归根结底只需要学习 1.3 里面的这1个例子就行,主要是修改下@boost的各种参数,
|
|
@@ -112,7 +132,7 @@ funboost 框架和一般的框架不一样,因为只有一行代码需要掌
|
|
|
112
132
|
很多新手需要小心翼翼模仿网上说的项目目录结构,以为不按照那么规划目录和命名就玩不起来,本身说明celery很坑。
|
|
113
133
|
```
|
|
114
134
|
|
|
115
|
-
### 1.0.2
|
|
135
|
+
### 1.0.2 分布式函数调度框架github地址
|
|
116
136
|
|
|
117
137
|
[查看分布式函数调度框架github项目](https://github.com/ydf0509/funboost)
|
|
118
138
|
|
|
@@ -367,8 +387,14 @@ win cmd和linux 运行时候,设置 PYTHONPATH 为项目根目录,是为了
|
|
|
367
387
|
而是根据实际情况函数的参数个数、函数的内部逻辑功能,全部都由用户自定义,函数里面想写什么就写什么,想干什么就干什么,极端自由。
|
|
368
388
|
也就是框架很容易学和使用,把下面的task_fun函数的入参和内部逻辑换成你自己想写的函数功能就可以了,框架只需要学习boost这一个函数的参数就行。
|
|
369
389
|
测试使用的时候函数里面加上sleep模拟阻塞,从而更好的了解框架的并发和各种控制功能。
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
```
|
|
393
|
+
有一点要说明的是框架的消息中间件的ip 端口 密码 等配置是在你第一次运行代码时候,在你当前项目的根目录下生成的 funboost_config.py 按需设置 (默认放在项目根目录是为了方便利用项目的 PYTHONPATH。当然,只要 PYTHONPATH 设置正确,
|
|
394
|
+
该配置文件可以放在磁盘的任意文件夹里面。用户可以看教程 6.18.3 问答章节)。
|
|
370
395
|
|
|
371
|
-
|
|
396
|
+
funboost_config.py 里面仅仅是配置 中间件连接,例如ip 端口这些简单的配置, 只需要第一次配置正确即可,
|
|
397
|
+
后续的开发中基本无需再次修改此文件。 因为所有消费函数任务控制功能都是在 BoosterParams 中传参。
|
|
372
398
|
```
|
|
373
399
|
|
|
374
400
|
### 1.3.1 funboost最简单例子
|
|
@@ -564,7 +590,9 @@ def task_fun(a: int, b: int):
|
|
|
564
590
|
队列操作,查看消费者详情:查看队列的所有消费者详情
|
|
565
591
|
[](https://imgse.com/i/pEJCgT1)
|
|
566
592
|
|
|
593
|
+
|
|
567
594
|
队列操作:查看消费曲线图,查看各种消费指标。
|
|
595
|
+
包括 历史运行次数 历史运行失败次数 近10秒完成 近10秒失败 近10秒函数运行平均耗时 累计函数运行平均耗时 剩余消息数量
|
|
568
596
|
[](https://imgse.com/i/pVpr7sP)
|
|
569
597
|
|
|
570
598
|
rpc调用:在网页上对30种消息队列发布消息并获取消息的函数执行结;根据taskid获取结果。
|
|
@@ -94,7 +94,7 @@ class AsyncPoolExecutor(FunboostFileLoggerMixin,FunboostBaseConcurrentPool):
|
|
|
94
94
|
|
|
95
95
|
def submit(self, func, *args, **kwargs):
|
|
96
96
|
future = asyncio.run_coroutine_threadsafe(self._produce(func, *args, **kwargs), self.loop) # 这个 run_coroutine_threadsafe 方法也有缺点,消耗的性能巨大。
|
|
97
|
-
future.result() # 阻止过快放入,放入超过队列大小后,使submit阻塞。
|
|
97
|
+
future.result() # 阻止过快放入,放入超过队列大小后,使submit阻塞。 背压是为了防止 迅速掏空消息队列几千万消息到内存.
|
|
98
98
|
|
|
99
99
|
async def _produce(self, func, *args, **kwargs):
|
|
100
100
|
await self._queue.put((func, args, kwargs))
|
|
@@ -123,7 +123,12 @@ class AsyncPoolExecutor(FunboostFileLoggerMixin,FunboostBaseConcurrentPool):
|
|
|
123
123
|
# asyncio.set_event_loop(self.loop)
|
|
124
124
|
# self.loop.run_until_complete(asyncio.wait([self._consume() for _ in range(self._size)], loop=self.loop))
|
|
125
125
|
# self._can_be_closed_flag = True
|
|
126
|
-
|
|
126
|
+
if self._specify_async_loop is None:
|
|
127
|
+
for _ in range(self._size):
|
|
128
|
+
self.loop.create_task(self._consume())
|
|
129
|
+
else:
|
|
130
|
+
for _ in range(self._size):
|
|
131
|
+
asyncio.run_coroutine_threadsafe(self._consume(),self.loop) # 这是 asyncio 专门提供的用于从其他线程向事件循环安全提交任务的函数。
|
|
127
132
|
if self._specify_async_loop is None:
|
|
128
133
|
self.loop.run_forever()
|
|
129
134
|
else:
|
|
@@ -101,6 +101,8 @@ class BrokerEnum:
|
|
|
101
101
|
|
|
102
102
|
HTTP = 'HTTP' # 基于http实现的,发布使用的urllib3,消费服务端使用的aiohttp.server实现的,支持分布式但不支持持久化,好处是不需要安装消息队列中间件软件。
|
|
103
103
|
|
|
104
|
+
GRPC = 'GRPC' # 使用知名grpc作为broker,可以使用 sync_call 方法同步获取grpc的结果, 简单程度暴击用户手写原生的 grpc客户端 服务端
|
|
105
|
+
|
|
104
106
|
NATS = 'NATS' # 高性能中间件nats,中间件服务端性能很好,。
|
|
105
107
|
|
|
106
108
|
TXT_FILE = 'TXT_FILE' # 磁盘txt文件作为消息队列,支持单机持久化,不支持多机分布式。不建议这个,用sqlite。
|
|
@@ -119,6 +121,27 @@ class BrokerEnum:
|
|
|
119
121
|
|
|
120
122
|
NAMEKO = 'NAMEKO' # funboost支持python微服务框架nameko,用户无需掌握nameko api语法,就玩转python nameko微服务
|
|
121
123
|
|
|
124
|
+
|
|
125
|
+
"""
|
|
126
|
+
MYSQL_CDC 是 funboost 中 神奇 的 与众不同的 broker 中间件
|
|
127
|
+
mysql binlog cdc 自动作为消息,用户无需手动发布消息,只需要写处理binlog内容的逻辑,
|
|
128
|
+
一行代码就能轻量级实现 mysql2mysql mysql2kafka mysql2rabbitmq 等等.
|
|
129
|
+
这个是与其他中间件不同,不需要手工发布消息, 任何对数据库的 insert update delete 会自动作为 funboost 的消息.
|
|
130
|
+
几乎是轻量级平替 canal flinkcdc 的作用.
|
|
131
|
+
|
|
132
|
+
以此类推, 日志文件也能扩展作为broker,只要另外一个程序写入了文件日志,就能触发funboost消费,
|
|
133
|
+
然后自己在函数逻辑把消息发到kafka,(虽然是已经有大名鼎鼎elk,这只是举个场景例子,说明funboost broker的灵活性)
|
|
134
|
+
|
|
135
|
+
日志文件、文件系统变更(inotify)、甚至是硬件传感器的信号,按照4.21章节文档,都可以被封装成一个 funboost 的 Broker。
|
|
136
|
+
|
|
137
|
+
充分说明 funboost 有能力化身为 通用的、事件驱动的函数调度平台,而非仅仅是celery这种传统的消息驱动.
|
|
138
|
+
"""
|
|
139
|
+
"""
|
|
140
|
+
funboost 有能力消费canal发到kafka的binlog消息,也能不依赖canal,自己捕获cdc数据
|
|
141
|
+
"""
|
|
142
|
+
MYSQL_CDC = 'MYSQL_CDC'
|
|
143
|
+
|
|
144
|
+
|
|
122
145
|
|
|
123
146
|
class ConcurrentModeEnum:
|
|
124
147
|
THREADING = 'threading' # 线程方式运行,兼容支持 async def 的异步函数。
|
|
@@ -637,10 +637,13 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
637
637
|
"""
|
|
638
638
|
self._do_not_delete_extra_from_msg = True
|
|
639
639
|
|
|
640
|
-
def
|
|
640
|
+
def _frame_custom_record_process_info_func(self,current_function_result_status: FunctionResultStatus,kw:dict):
|
|
641
641
|
pass
|
|
642
642
|
|
|
643
|
-
|
|
643
|
+
def user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus,): # 这个可以继承
|
|
644
|
+
pass
|
|
645
|
+
|
|
646
|
+
async def aio_user_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus,): # 这个可以继承
|
|
644
647
|
pass
|
|
645
648
|
|
|
646
649
|
def _convert_real_function_only_params_by_conusuming_function_kind(self, function_only_params: dict,extra_params:dict):
|
|
@@ -729,9 +732,10 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
729
732
|
|
|
730
733
|
with self._lock_for_count_execute_task_times_every_unit_time:
|
|
731
734
|
self.metric_calculation.cal(t_start_run_fun,current_function_result_status)
|
|
732
|
-
self.
|
|
735
|
+
self._frame_custom_record_process_info_func(current_function_result_status,kw)
|
|
736
|
+
self.user_custom_record_process_info_func(current_function_result_status,) # 两种方式都可以自定义,记录结果,建议继承方式,不使用boost中指定 user_custom_record_process_info_func
|
|
733
737
|
if self.consumer_params.user_custom_record_process_info_func:
|
|
734
|
-
self.consumer_params.user_custom_record_process_info_func(current_function_result_status)
|
|
738
|
+
self.consumer_params.user_custom_record_process_info_func(current_function_result_status,)
|
|
735
739
|
except BaseException as e:
|
|
736
740
|
log_msg = f' error 严重错误 {type(e)} {e} '
|
|
737
741
|
# self.logger.critical(msg=f'{log_msg} \n', exc_info=True)
|
|
@@ -888,10 +892,11 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
888
892
|
async with self._async_lock_for_count_execute_task_times_every_unit_time:
|
|
889
893
|
self.metric_calculation.cal(t_start_run_fun, current_function_result_status)
|
|
890
894
|
|
|
891
|
-
self.
|
|
892
|
-
|
|
895
|
+
self._frame_custom_record_process_info_func(current_function_result_status)
|
|
896
|
+
self.user_custom_record_process_info_func(current_function_result_status,) # 两种方式都可以自定义,记录结果.建议使用文档4.21.b的方式继承来重写
|
|
897
|
+
await self.aio_user_custom_record_process_info_func(current_function_result_status,)
|
|
893
898
|
if self.consumer_params.user_custom_record_process_info_func:
|
|
894
|
-
self.consumer_params.user_custom_record_process_info_func(current_function_result_status)
|
|
899
|
+
self.consumer_params.user_custom_record_process_info_func(current_function_result_status,)
|
|
895
900
|
|
|
896
901
|
except BaseException as e:
|
|
897
902
|
log_msg = f' error 严重错误 {type(e)} {e} '
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# @Author : ydf
|
|
3
|
+
# @Time : 2023/8/8 0008 13:32
|
|
4
|
+
|
|
5
|
+
import abc
|
|
6
|
+
import threading
|
|
7
|
+
import grpc
|
|
8
|
+
import time
|
|
9
|
+
|
|
10
|
+
from funboost import FunctionResultStatus
|
|
11
|
+
from funboost.assist.grpc_helper import funboost_grpc_pb2_grpc, funboost_grpc_pb2
|
|
12
|
+
from funboost.consumers.base_consumer import AbstractConsumer
|
|
13
|
+
from funboost.core.serialization import Serialization
|
|
14
|
+
from funboost.core.exceptions import FunboostWaitRpcResultTimeout
|
|
15
|
+
from funboost.concurrent_pool.flexible_thread_pool import FlexibleThreadPool
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class FutureStatusResult:
|
|
19
|
+
def __init__(self,call_type:str):
|
|
20
|
+
self.execute_finish_event = threading.Event()
|
|
21
|
+
self.staus_result_obj: FunctionResultStatus = None
|
|
22
|
+
self.call_type = call_type # sync_call or publish
|
|
23
|
+
|
|
24
|
+
def set_finish(self):
|
|
25
|
+
self.execute_finish_event.set()
|
|
26
|
+
|
|
27
|
+
def wait_finish(self,rpc_timeout):
|
|
28
|
+
return self.execute_finish_event.wait(rpc_timeout)
|
|
29
|
+
|
|
30
|
+
def set_staus_result_obj(self, staus_result_obj:FunctionResultStatus):
|
|
31
|
+
self.staus_result_obj = staus_result_obj
|
|
32
|
+
|
|
33
|
+
def get_staus_result_obj(self):
|
|
34
|
+
return self.staus_result_obj
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class GrpcConsumer(AbstractConsumer, ):
|
|
40
|
+
"""
|
|
41
|
+
grpc as broker
|
|
42
|
+
"""
|
|
43
|
+
BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'host': '127.0.0.1', 'port': None}
|
|
44
|
+
|
|
45
|
+
def custom_init(self):
|
|
46
|
+
class FunboostGrpcServicer(funboost_grpc_pb2_grpc.FunboostBrokerServiceServicer):
|
|
47
|
+
"""
|
|
48
|
+
HelloService 的实现类
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def Call(this, request, context):
|
|
52
|
+
"""
|
|
53
|
+
实现 SayHello 方法
|
|
54
|
+
"""
|
|
55
|
+
future_status_result = FutureStatusResult(call_type=request.call_type)
|
|
56
|
+
kw = {'body': request.json_req, 'future_status_result': future_status_result,}
|
|
57
|
+
self._submit_task(kw)
|
|
58
|
+
if request.call_type =="sync_call":
|
|
59
|
+
if future_status_result.wait_finish(self.consumer_params.rpc_timeout): # 等待并发出的消费结果
|
|
60
|
+
return funboost_grpc_pb2.FunboostGrpcResponse(json_resp=Serialization.to_json_str(
|
|
61
|
+
future_status_result.get_staus_result_obj().get_status_dict(without_datetime_obj=True)))
|
|
62
|
+
else:
|
|
63
|
+
self.logger.error(f'wait rpc data timeout')
|
|
64
|
+
context.set_code(grpc.StatusCode.DEADLINE_EXCEEDED)
|
|
65
|
+
context.set_details(f'wait rpc data timeout')
|
|
66
|
+
# raise FunboostWaitRpcResultTimeout(f'wait rpc data timeout')
|
|
67
|
+
else:
|
|
68
|
+
return funboost_grpc_pb2.FunboostGrpcResponse(json_resp='{"publish_status":"ok"}')
|
|
69
|
+
|
|
70
|
+
self.GRPC_SERVICER_CLS = FunboostGrpcServicer
|
|
71
|
+
|
|
72
|
+
def _shedual_task(self):
|
|
73
|
+
server = grpc.server(self.concurrent_pool)
|
|
74
|
+
|
|
75
|
+
# 添加服务
|
|
76
|
+
funboost_grpc_pb2_grpc.add_FunboostBrokerServiceServicer_to_server(self.GRPC_SERVICER_CLS(), server)
|
|
77
|
+
|
|
78
|
+
# 绑定端口
|
|
79
|
+
port = self.consumer_params.broker_exclusive_config['port']
|
|
80
|
+
if port is None:
|
|
81
|
+
raise ValueError('please specify port')
|
|
82
|
+
listen_addr = f'[::]:{port}'
|
|
83
|
+
server.add_insecure_port(listen_addr)
|
|
84
|
+
|
|
85
|
+
# 启动服务器
|
|
86
|
+
server.start()
|
|
87
|
+
print(f"GRPC Has started. listening on: {listen_addr}")
|
|
88
|
+
|
|
89
|
+
while True:
|
|
90
|
+
time.sleep(100) # 保持服务器运行
|
|
91
|
+
|
|
92
|
+
def _confirm_consume(self, kw):
|
|
93
|
+
pass
|
|
94
|
+
|
|
95
|
+
def _requeue(self, kw):
|
|
96
|
+
pass
|
|
97
|
+
|
|
98
|
+
def _frame_custom_record_process_info_func(self, current_function_result_status: FunctionResultStatus, kw):
|
|
99
|
+
future_status_result: FutureStatusResult = kw['future_status_result']
|
|
100
|
+
if future_status_result.call_type == "sync_call":
|
|
101
|
+
future_status_result.set_staus_result_obj(current_function_result_status)
|
|
102
|
+
future_status_result.set_finish() # 这是最重要最核心的, 并发池里面处理函数完成,马上告诉grpc服务端,已经处理完成.
|
|
@@ -22,7 +22,7 @@ class KafkaConsumer(AbstractConsumer):
|
|
|
22
22
|
可以让消费函数内部 sleep60秒,突然停止消费代码,使用 kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --describe --group funboost 来证实自动确认消费和手动确认消费的区别。
|
|
23
23
|
"""
|
|
24
24
|
|
|
25
|
-
BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'group_id': 'funboost_kafka', 'auto_offset_reset': 'earliest'}
|
|
25
|
+
BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'group_id': 'funboost_kafka', 'auto_offset_reset': 'earliest','num_partitions':10,'replication_factor':1,}
|
|
26
26
|
# not_all_brokers_general_settings配置 ,支持独立的中间件配置参数是 group_id 和 auto_offset_reset
|
|
27
27
|
"""
|
|
28
28
|
auto_offset_reset 介绍
|
|
@@ -35,7 +35,9 @@ class KafkaConsumer(AbstractConsumer):
|
|
|
35
35
|
def _shedual_task(self):
|
|
36
36
|
try:
|
|
37
37
|
admin_client = KafkaPythonImporter().KafkaAdminClient(bootstrap_servers=BrokerConnConfig.KAFKA_BOOTSTRAP_SERVERS)
|
|
38
|
-
admin_client.create_topics([KafkaPythonImporter().NewTopic(self._queue_name,
|
|
38
|
+
admin_client.create_topics([KafkaPythonImporter().NewTopic(self._queue_name,
|
|
39
|
+
self.consumer_params.broker_exclusive_config['num_partitions'],
|
|
40
|
+
self.consumer_params.broker_exclusive_config['replication_factor'])])
|
|
39
41
|
# admin_client.create_partitions({self._queue_name: NewPartitions(total_count=16)})
|
|
40
42
|
except KafkaPythonImporter().TopicAlreadyExistsError:
|
|
41
43
|
pass
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
# @Author : ydf
|
|
3
3
|
# @Time : 2021/4/18 0008 13:32
|
|
4
4
|
|
|
5
|
+
"""
|
|
6
|
+
这个可以实现kafka topic单分区,但funboost 200线程消费消息,并且随意强制重启消费进程,不丢失消息
|
|
7
|
+
"""
|
|
5
8
|
|
|
6
9
|
import json
|
|
7
10
|
import threading
|
|
@@ -28,7 +31,7 @@ class KafkaConsumerManuallyCommit(AbstractConsumer):
|
|
|
28
31
|
可以让消费函数内部 sleep 60秒,突然停止消费代码,使用 kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --describe --group frame_group 来证实自动确认消费和手动确认消费的区别。
|
|
29
32
|
"""
|
|
30
33
|
|
|
31
|
-
BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'group_id': '
|
|
34
|
+
BROKER_EXCLUSIVE_CONFIG_DEFAULT = {'group_id': 'funboost_kafka', 'auto_offset_reset': 'earliest','num_partitions':10,'replication_factor':1,}
|
|
32
35
|
|
|
33
36
|
def custom_init(self):
|
|
34
37
|
self._lock_for_operate_offset_dict = threading.Lock()
|
|
@@ -37,7 +40,9 @@ class KafkaConsumerManuallyCommit(AbstractConsumer):
|
|
|
37
40
|
|
|
38
41
|
try:
|
|
39
42
|
admin_client = KafkaPythonImporter().KafkaAdminClient(bootstrap_servers=BrokerConnConfig.KAFKA_BOOTSTRAP_SERVERS)
|
|
40
|
-
admin_client.create_topics([KafkaPythonImporter().NewTopic(self._queue_name,
|
|
43
|
+
admin_client.create_topics([KafkaPythonImporter().NewTopic(self._queue_name,
|
|
44
|
+
self.consumer_params.broker_exclusive_config['num_partitions'],
|
|
45
|
+
self.consumer_params.broker_exclusive_config['replication_factor'])])
|
|
41
46
|
# admin_client.create_partitions({self._queue_name: NewPartitions(total_count=16)})
|
|
42
47
|
except KafkaPythonImporter().TopicAlreadyExistsError:
|
|
43
48
|
pass
|