funboost 49.4__tar.gz → 49.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of funboost might be problematic. Click here for more details.
- {funboost-49.4/funboost.egg-info → funboost-49.6}/PKG-INFO +4 -3
- {funboost-49.4 → funboost-49.6}/README.md +2 -2
- {funboost-49.4 → funboost-49.6}/funboost/__init__.py +1 -1
- {funboost-49.4 → funboost-49.6}/funboost/beggar_version_implementation/beggar_redis_consumer.py +3 -1
- {funboost-49.4 → funboost-49.6}/funboost/constant.py +20 -3
- {funboost-49.4 → funboost-49.6}/funboost/consumers/base_consumer.py +7 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/celery_consumer.py +1 -0
- funboost-49.6/funboost/consumers/empty_consumer.py +37 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/kombu_consumer.py +0 -50
- {funboost-49.4 → funboost-49.6}/funboost/consumers/rabbitmq_amqpstorm_consumer.py +1 -1
- {funboost-49.4 → funboost-49.6}/funboost/funboost_config_deafult.py +2 -1
- {funboost-49.4 → funboost-49.6}/funboost/timing_job/apscheduler_use_redis_store.py +18 -4
- {funboost-49.4 → funboost-49.6}/funboost/utils/__init__.py +1 -1
- {funboost-49.4 → funboost-49.6}/funboost/utils/ctrl_c_end.py +1 -1
- {funboost-49.4 → funboost-49.6}/funboost/utils/redis_manager.py +6 -4
- {funboost-49.4 → funboost-49.6/funboost.egg-info}/PKG-INFO +4 -3
- {funboost-49.4 → funboost-49.6}/funboost.egg-info/requires.txt +1 -1
- {funboost-49.4 → funboost-49.6}/setup.py +2 -2
- funboost-49.4/funboost/consumers/empty_consumer.py +0 -26
- {funboost-49.4 → funboost-49.6}/LICENSE +0 -0
- {funboost-49.4 → funboost-49.6}/MANIFEST.in +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/__init__old.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/__main__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/assist/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/assist/celery_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/assist/dramatiq_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/assist/faststream_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/assist/huey_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/assist/rocketry_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/assist/rq_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/assist/rq_windows_worker.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/assist/taskiq_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/async_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/async_pool_executor.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/backup/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/backup/async_pool_executor0223.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/backup/async_pool_executor_back.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/backup/async_pool_executor_janus.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/backup/grok_async_pool.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/base_pool_type.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/bounded_processpoolexcutor_py36.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/bounded_threadpoolexcutor.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/custom_evenlet_pool_executor.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/custom_gevent_pool_executor.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/custom_threadpool_executor.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/custom_threadpool_executor000.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/fixed_thread_pool.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/flexible_thread_pool.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/pool_commons.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/single_thread_executor.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/confirm_mixin.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/dramatiq_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/faststream_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/http_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/http_consumer000.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/httpsqs_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/huey_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/kafka_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/kafka_consumer_manually_commit.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/local_python_queue_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/memory_deque_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/mongomq_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/mqtt_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/nameko_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/nats_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/nsq_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/peewee_conusmer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/persist_queue_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/pulsar_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/rabbitmq_pika_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/rabbitmq_pika_consumerv0.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/rabbitmq_rabbitpy_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/redis_brpoplpush_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/redis_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/redis_consumer_ack_able.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/redis_consumer_ack_using_timeout.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/redis_consumer_priority.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/redis_consumer_simple.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/redis_filter.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/redis_pubsub_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/redis_stream_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/rocketmq_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/rq_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/sqlachemy_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/tcp_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/txt_file_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/udp_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/consumers/zeromq_consumer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/contrib/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/contrib/api_publish_msg.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/contrib/django_db_deco.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/contrib/queue2queue.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/contrib/redis_consume_latest_msg_broker.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/contrib/save_result_status_to_sqldb.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/active_cousumer_info_getter.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/booster.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/cli/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/cli/discovery_boosters.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/cli/funboost_cli_user_templ.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/cli/funboost_fire.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/current_task.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/exceptions.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/fabric_deploy_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/funboost_config_getter.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/funboost_time.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/func_params_model.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/function_result_status_config.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/function_result_status_saver.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/helper_funs.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/kill_remote_task.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/lazy_impoter.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/loggers.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/msg_result_getter.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/muliti_process_enhance.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/serialization.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/core/task_id_logger.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/factories/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/factories/broker_kind__publsiher_consumer_type_map.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/factories/consumer_factory.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/factories/publisher_factotry.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/__pycache__/app.cpython-313.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/__pycache__/app.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/__pycache__/app.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/__pycache__/functions.cpython-313.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/__pycache__/functions.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/__pycache__/functions.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/app.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/app_debug_start.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/functions.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/assets/css/custom.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/assets/css/jquery.mCustomScrollbar.min.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/assets/img/user.jpg +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/assets/js/custom.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/assets/js/jquery.mCustomScrollbar.concat.min.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css/content_page_style.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css/style.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/css/font-awesome.min.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/FontAwesome.otf +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.eot +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.svg +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.ttf +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/font-awesome/4.7.0/fonts/fontawesome-webfont.woff2 +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/select2/4.0.13/css/select2.min.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator.min.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/tabulator-tables@5.5.0/tabulator_bootstrap3.min.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/css/bootstrap.min.css +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.eot +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.svg +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.ttf +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/css_cdn/twitter-bootstrap/3.3.7/fonts/glyphicons-halflings-regular.woff2 +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/images/bg.jpg +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/images/favicon.ico +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/images/password.png +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/images/tick.png +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/images/user.png +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/js/bootstrap-datetimepicker.min.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/js/echarts.min.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/js/form-memory.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/js/jquery-1.11.0.min.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/js/moment-with-locales.min.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/js/select2.min.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/js_cdn/bootstrap/3.3.7/js/bootstrap.min.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/js_cdn/chart.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/static/js_cdn/tabulator-tables@5.5.0/dist/js/tabulator.min.js +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/about.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/conusme_speed.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/fun_result_table.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/index.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/index_backup.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/login.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/queue_op.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/rpc_call.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/running_consumer_by_ip.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/function_result_web/templates/running_consumer_by_queue_name.html +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/base_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/celery_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/celery_publisher000.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/confluent_kafka_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/dramatiq_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/empty_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/faststream_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/http_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/httpsqs_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/huey_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/kafka_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/kombu_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/local_python_queue_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/meomory_deque_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/mongomq_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/mqtt_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/nameko_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/nats_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/nsq_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/peewee_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/persist_queue_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/pulsar_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/rabbitmq_amqpstorm_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/rabbitmq_pika_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/rabbitmq_rabbitpy_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/redis_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/redis_publisher_lpush.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/redis_publisher_priority.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/redis_publisher_simple.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/redis_pubsub_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/redis_queue_flush_mixin.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/redis_stream_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/rocketmq_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/rq_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/sqla_queue_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/tcp_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/txt_file_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/udp_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/publishers/zeromq_publisher.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/queues/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/queues/memory_queues_map.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/queues/peewee_queue.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/queues/sqla_queue.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/set_frame_config.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/timing_job/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/timing_job/apscheduler_use_mysql_store.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/timing_job/timing_job_base.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/timing_job/timing_push.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/apscheduler_monkey.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/block_exit.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/bulk_operation.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/class_utils.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/class_utils2.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/custom_pysnooper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/decorators.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages/mongomq/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages/mongomq/lock.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages/mongomq/mongomq.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages/mongomq/mongomq0000.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages/mongomq/test.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages/mongomq/utils.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-313.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-313.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/__pycache__/add_to_pythonpath.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/add_to_pythonpath.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/client.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/compat.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/connection.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/lock.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/__pycache__/utils.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/client.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/compat.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/connection.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/exceptions.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/lock.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/log.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/py.typed +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/readme.md +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/sentinel.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/aioredis/utils.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/StoppableThread.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/StoppableThread.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/__init__.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/dafunc.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/exceptions.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-311.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-37.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/__pycache__/py3_raise.cpython-39.pyc +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/dafunc2222.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/exceptions.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py2_raise.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/func_timeout/py3_raise.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/dependency_packages_in_pythonpath/readme.md +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/develop_log.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/expire_lock.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/func_timeout/StoppableThread.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/func_timeout/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/func_timeout/dafunc.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/func_timeout/exceptions.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/func_timeout/py2_raise.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/func_timeout/py3_raise.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/json_helper.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/mongo_util.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/monkey_color_log.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/monkey_patches.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/mqtt_util.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/paramiko_util.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/pysnooper_ydf/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/pysnooper_ydf/pycompat.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/pysnooper_ydf/tracer.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/pysnooper_ydf/utils.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/pysnooper_ydf/variables.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/rabbitmq_factory.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/redis_manager_old.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/resource_monitoring.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/restart_python.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/simple_data_class.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/str_utils.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/time_util.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/times/__init__.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/times/version.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost/utils/un_strict_json_dumps.py +0 -0
- {funboost-49.4 → funboost-49.6}/funboost.egg-info/SOURCES.txt +0 -0
- {funboost-49.4 → funboost-49.6}/funboost.egg-info/dependency_links.txt +0 -0
- {funboost-49.4 → funboost-49.6}/funboost.egg-info/entry_points.txt +0 -0
- {funboost-49.4 → funboost-49.6}/funboost.egg-info/top_level.txt +0 -0
- {funboost-49.4 → funboost-49.6}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version: 49.
|
|
3
|
+
Version: 49.6
|
|
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
|
|
@@ -24,6 +24,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.11
|
|
25
25
|
Classifier: Programming Language :: Python :: 3.12
|
|
26
26
|
Classifier: Programming Language :: Python :: 3.13
|
|
27
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
27
28
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
28
29
|
Classifier: Topic :: Software Development :: Libraries
|
|
29
30
|
Description-Content-Type: text/markdown
|
|
@@ -73,9 +74,9 @@ Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”
|
|
|
73
74
|
框架对代码没有入侵,可以加到任意已有项目而对项目python文件目录结构0要求,
|
|
74
75
|
不像 celery django scrapy 这样的框架,要从一开始就开始规划好项目目录结构,如果不想用框架了,
|
|
75
76
|
或者想改变使用其他框架框架,那么已经所写的代码组织形式就几乎成了废物,需要大改特改.
|
|
76
|
-
但是funboost
|
|
77
|
+
但是funboost完全不会这样,不管是加上还是去掉@boost装饰器,对你的项目影响为0,用户照常使用,
|
|
77
78
|
所以用户可以对任意项目,任意时候,引入使用funboost或者去掉使用funboost,代码组织形式不需要发生变化.
|
|
78
|
-
(即使不想用funboost了,也不需要亲自去掉@boost
|
|
79
|
+
(即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数上面有@boost装饰器对函数自身的直接调用运行没有任何影响,
|
|
79
80
|
用户照样可以直接例如 fun(x,y)是直接运行函数 , fun.push(x,y) 才是发送到消息队列)
|
|
80
81
|
|
|
81
82
|
通过funboost web manager 管理系统,支持全面 查看 监控 管理 funboost的任务消费。
|
|
@@ -39,9 +39,9 @@ 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
|
|
44
|
+
(即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数上面有@boost装饰器对函数自身的直接调用运行没有任何影响,
|
|
45
45
|
用户照样可以直接例如 fun(x,y)是直接运行函数 , fun.push(x,y) 才是发送到消息队列)
|
|
46
46
|
|
|
47
47
|
通过funboost web manager 管理系统,支持全面 查看 监控 管理 funboost的任务消费。
|
{funboost-49.4 → funboost-49.6}/funboost/beggar_version_implementation/beggar_redis_consumer.py
RENAMED
|
@@ -19,7 +19,9 @@ from concurrent.futures import ThreadPoolExecutor
|
|
|
19
19
|
from funboost.funboost_config_deafult import BrokerConnConfig
|
|
20
20
|
|
|
21
21
|
redis_db_frame = redis.Redis(host=BrokerConnConfig.REDIS_HOST, password=BrokerConnConfig.REDIS_PASSWORD,
|
|
22
|
-
port=BrokerConnConfig.REDIS_PORT, db=BrokerConnConfig.REDIS_DB,
|
|
22
|
+
port=BrokerConnConfig.REDIS_PORT, db=BrokerConnConfig.REDIS_DB,
|
|
23
|
+
ssl=BrokerConnConfig.REDIS_USE_SSL,
|
|
24
|
+
decode_responses=True)
|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
class BeggarRedisConsumer:
|
|
@@ -10,12 +10,21 @@ class BrokerEnum:
|
|
|
10
10
|
|
|
11
11
|
RABBITMQ_RABBITPY = 'RABBITMQ_RABBITPY' # 使用 rabbitpy 包操作rabbitmq 作为 分布式消息队列,支持消费确认,不建议使用
|
|
12
12
|
|
|
13
|
+
"""
|
|
14
|
+
以下是各种redis数据结构和各种方式来实现作为消息队列的,redis简直被作者玩出花来了.
|
|
15
|
+
因为redis本身是缓存数据库,不是消息队列,redis没有实现经典AMQP协议,所以redis是模拟消息队列不是真消息队列.
|
|
16
|
+
例如要实现消费确认,随意重启但消息万无一失,你搞个简单的 redis.blpop 弹出删除消息,那就压根不行.重启就丢失了,但消息可能还没开始运行或者正在运行中.
|
|
17
|
+
|
|
18
|
+
redis做ack挑战难点不是怎么实现确认消费本身,而是何时应该把关闭或宕机进程的消费者的待确认消费的孤儿消息重回队列.
|
|
19
|
+
在 Redis 上实现 ACK 的真正难点,根本不在于“确认”这个动作本身,而在于建立一套可靠的、能够准确判断“何时可以安全地及时地进行任务恢复”的分布式故障检测机制。
|
|
20
|
+
所以你以为只要使用 brpoplpush 或者 REDIS_STREAM 就能自动轻易解决ack问题,那就太天真了,因为redis服务端不能像rabbitmq服务端那样天生自带自动重回宕机消费者的消息机制,需要你在redis客户端来维护实现这套机制.
|
|
21
|
+
"""
|
|
13
22
|
REDIS = 'REDIS' # 使用 redis 的 list结构,brpop 作为分布式消息队列。随意重启和关闭会丢失大量消息,不支持消费确认。注重性能不在乎丢失消息可以选这个redis方案。
|
|
14
23
|
REDIS_ACK_ABLE = 'REDIS_ACK_ABLE' # 基于redis的 list + 临时unack的set队列,采用了 lua脚本操持了取任务和加到pengding为原子性,,基于进程心跳消失判断消息是否为掉线进程的,随意重启和掉线不会丢失任务。
|
|
15
|
-
REIDS_ACK_USING_TIMEOUT = 'reids_ack_using_timeout' # 基于redis的 list + 临时unack的set队列,使用超时多少秒没确认消费就自动重回队列,请注意 ack_timeout的设置值和函数耗时大小,否则会发生反复重回队列的后果,boost可以设置ack超时,broker_exclusive_config={'ack_timeout': 1800}
|
|
24
|
+
REIDS_ACK_USING_TIMEOUT = 'reids_ack_using_timeout' # 基于redis的 list + 临时unack的set队列,使用超时多少秒没确认消费就自动重回队列,请注意 ack_timeout的设置值和函数耗时大小,否则会发生反复重回队列的后果,boost可以设置ack超时,broker_exclusive_config={'ack_timeout': 1800}.缺点是无法区分执行太慢还是真宕机
|
|
16
25
|
REDIS_PRIORITY = 'REDIS_PRIORITY' # # 基于redis的多 list + 临时unack的set队列,blpop监听多个key,和rabbitmq的x-max-priority属性一样,支持任务优先级。看文档4.29优先级队列说明。
|
|
17
26
|
REDIS_STREAM = 'REDIS_STREAM' # 基于redis 5.0 版本以后,使用 stream 数据结构作为分布式消息队列,支持消费确认和持久化和分组消费,是redis官方推荐的消息队列形式,比list结构更适合。
|
|
18
|
-
RedisBrpopLpush = 'RedisBrpopLpush' # 基于redis的list结构但是采用brpoplpush 双队列形式,和 redis_ack_able的实现差不多,实现上采用了原生命令就不需要lua脚本来实现取出和加入unack了。
|
|
27
|
+
RedisBrpopLpush = 'RedisBrpopLpush' # 基于redis的list结构但是采用 brpoplpush 双队列形式,和 redis_ack_able的实现差不多,实现上采用了原生命令就不需要lua脚本来实现取出和加入unack了。
|
|
19
28
|
REDIS_PUBSUB = 'REDIS_PUBSUB' # 基于redis 发布订阅的,发布一个消息多个消费者都能收到同一条消息,但不支持持久化
|
|
20
29
|
|
|
21
30
|
MEMORY_QUEUE = 'MEMORY_QUEUE' # 使用python queue.Queue实现的基于当前python进程的消息队列,不支持跨进程 跨脚本 跨机器共享任务,不支持持久化,适合一次性短期简单任务。
|
|
@@ -44,8 +53,15 @@ class BrokerEnum:
|
|
|
44
53
|
|
|
45
54
|
ZEROMQ = 'ZEROMQ' # 基于zeromq作为分布式消息队列,不需要安装中间件,可以支持跨机器但不支持持久化。
|
|
46
55
|
|
|
56
|
+
|
|
47
57
|
"""
|
|
48
|
-
|
|
58
|
+
kombu 和 celery 都是 funboost中的神级别broker_kind。
|
|
59
|
+
使得funboost以逸待劳,支持kombu的所有现有和未来的消息队列。
|
|
60
|
+
通过直接支持 kombu,funboost 相当于一瞬间就继承了 `kombu` 支持的所有现有和未来的消息队列能力。无论 kombu 社区未来增加了对哪种新的云消息服务(如 Google
|
|
61
|
+
Pub/Sub、Azure Service Bus)或小众 MQ 的支持,funboost 无需修改自身代码,就能自动获得这种能力。这
|
|
62
|
+
是一种“以逸待劳”的策略,极大地扩展了 funboost 的适用范围。
|
|
63
|
+
|
|
64
|
+
kombu 包可以作为funboost的broker,这个包也是celery的中间件依赖包,这个包可以操作10种中间件(例如rabbitmq redis),但没包括分布式函数调度框架的kafka nsq zeromq 等。
|
|
49
65
|
同时 kombu 包的性能非常差,可以用原生redis的lpush和kombu的publish测试发布,使用brpop 和 kombu 的 drain_events测试消费,对比差距相差了5到10倍。
|
|
50
66
|
由于性能差,除非是分布式函数调度框架没实现的中间件才选kombu方式(例如kombu支持亚马逊队列 qpid pyro 队列),否则强烈建议使用此框架的操作中间件方式而不是使用kombu。
|
|
51
67
|
"""
|
|
@@ -74,6 +90,7 @@ class BrokerEnum:
|
|
|
74
90
|
|
|
75
91
|
CELERY = 'CELERY' # funboost支持celery框架来发布和消费任务,由celery框架来调度执行任务,但是写法简单远远暴击用户亲自使用celery的麻烦程度,
|
|
76
92
|
# 用户永无无需关心和操作Celery对象实例,无需关心celery的task_routes和includes配置,funboost来自动化设置这些celery配置。
|
|
93
|
+
# funboost将Celery本身纳入了自己的Broker体系。能“吞下”另一个大型框架,简直太妙了。本身就证明了funboost架构的包容性和精妙性和复杂性。
|
|
77
94
|
|
|
78
95
|
DRAMATIQ = 'DRAMATIQ' # funboost使用 dramatiq 框架作为消息队列,dramatiq类似celery也是任务队列框架。用户使用funboost api来操作dramatiq核心调度。
|
|
79
96
|
|
|
@@ -437,6 +437,13 @@ class AbstractConsumer(LoggerLevelSetterMixin, metaclass=abc.ABCMeta, ):
|
|
|
437
437
|
def _shedual_task(self):
|
|
438
438
|
"""
|
|
439
439
|
每个子类必须实现这个的方法,完成如何从中间件取出消息,并将函数和运行参数添加到工作池。
|
|
440
|
+
|
|
441
|
+
funboost 的 _shedual_task 哲学是:“我不管你怎么从你的系统里拿到任务,我只要求你拿到任务后,
|
|
442
|
+
调用 self._submit_task(msg) 方法把它交给我处理就行。”
|
|
443
|
+
|
|
444
|
+
所以无论获取消息是 拉模式 还是推模式 还是轮询模式,无论是是单条获取 还是多条批量多条获取,
|
|
445
|
+
都能轻松扩展任意东西作为funboost的中间件。
|
|
446
|
+
|
|
440
447
|
:return:
|
|
441
448
|
"""
|
|
442
449
|
raise NotImplementedError
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# @Author : ydf
|
|
3
|
+
# @Time : 2023/8/8 0008 13:32
|
|
4
|
+
|
|
5
|
+
import abc
|
|
6
|
+
from funboost.consumers.base_consumer import AbstractConsumer
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class EmptyConsumer(AbstractConsumer, metaclass=abc.ABCMeta):
|
|
10
|
+
"""
|
|
11
|
+
一个空的消费者基类,作为自定义 Broker 的模板。
|
|
12
|
+
|
|
13
|
+
这个类其实是多余的,因为用户完全可以继承AbstractConsumer,然后实现custom_init方法,然后实现_shedual_task, _confirm_consume, _requeue方法来新增自定义broker。
|
|
14
|
+
这个类是为了清晰明确的告诉你,仅仅需要下面三个方法,就可以实现一个自定义broker,因为AbstractConsumer基类功能太丰富了,基类方法是在太多了,用户不知道需要继承重写哪方法
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
"""
|
|
18
|
+
def custom_init(self):
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
@abc.abstractmethod
|
|
22
|
+
def _shedual_task(self):
|
|
23
|
+
"""
|
|
24
|
+
核心调度任务。此方法需要实现一个循环,负责从你的中间件中获取消息,
|
|
25
|
+
然后调用 `self._submit_task(msg)` 将任务提交到框架的并发池中执行。 可以参考funboos源码中的各种消费者实现。
|
|
26
|
+
"""
|
|
27
|
+
raise NotImplemented('not realization')
|
|
28
|
+
|
|
29
|
+
@abc.abstractmethod
|
|
30
|
+
def _confirm_consume(self, kw):
|
|
31
|
+
"""确认消费,就是ack概念"""
|
|
32
|
+
raise NotImplemented('not realization')
|
|
33
|
+
|
|
34
|
+
@abc.abstractmethod
|
|
35
|
+
def _requeue(self, kw):
|
|
36
|
+
"""重新入队"""
|
|
37
|
+
raise NotImplemented('not realization')
|
|
@@ -17,55 +17,6 @@ from kombu.transport.redis import Empty
|
|
|
17
17
|
from funboost.consumers.base_consumer import AbstractConsumer
|
|
18
18
|
from funboost.funboost_config_deafult import BrokerConnConfig
|
|
19
19
|
|
|
20
|
-
def patch_kombu_redis000():
|
|
21
|
-
# 这个也可以,代码长了一点。
|
|
22
|
-
"""
|
|
23
|
-
给kombu的redis 模式打猴子补丁
|
|
24
|
-
kombu有bug,redis中间件 unnacked 中的任务即使客户端掉线了或者突然关闭脚本中正在运行的任务,也永远不会被重新消费。
|
|
25
|
-
这个很容易验证那个测试,把消费函数写成sleep 100秒,启动20秒后把脚本关掉,取出来的任务在 unacked 队列中那个永远不会被确认消费,也不会被重新消费。
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
# noinspection PyUnusedLocal
|
|
29
|
-
def monkey_get(self, callback, timeout=None):
|
|
30
|
-
self._in_protected_read = True
|
|
31
|
-
try:
|
|
32
|
-
for channel in self._channels:
|
|
33
|
-
if channel.active_queues: # BRPOP mode?
|
|
34
|
-
if channel.qos.can_consume():
|
|
35
|
-
self._register_BRPOP(channel)
|
|
36
|
-
if channel.active_fanout_queues: # LISTEN mode?
|
|
37
|
-
self._register_LISTEN(channel)
|
|
38
|
-
|
|
39
|
-
events = self.poller.poll(timeout)
|
|
40
|
-
if events:
|
|
41
|
-
for fileno, event in events:
|
|
42
|
-
ret = None
|
|
43
|
-
# noinspection PyBroadException,PyUnusedLocal
|
|
44
|
-
try:
|
|
45
|
-
ret = self.handle_event(fileno, event) # 主要是这行改了加了try,不然会raise empty 导致self.maybe_restore_messages()没执行
|
|
46
|
-
except BaseException as e:
|
|
47
|
-
pass
|
|
48
|
-
# print(traceback.format_exc())
|
|
49
|
-
# print(e)
|
|
50
|
-
if ret:
|
|
51
|
-
return
|
|
52
|
-
# - no new data, so try to restore messages.
|
|
53
|
-
# - reset active redis commands.
|
|
54
|
-
self.maybe_restore_messages()
|
|
55
|
-
raise Empty()
|
|
56
|
-
# raise Exception('kombu.five.Empty')
|
|
57
|
-
finally:
|
|
58
|
-
self._in_protected_read = False
|
|
59
|
-
# print(self.after_read)
|
|
60
|
-
while self.after_read:
|
|
61
|
-
try:
|
|
62
|
-
fun = self.after_read.pop()
|
|
63
|
-
except KeyError:
|
|
64
|
-
break
|
|
65
|
-
else:
|
|
66
|
-
fun()
|
|
67
|
-
|
|
68
|
-
redis.MultiChannelPoller.get = monkey_get
|
|
69
20
|
|
|
70
21
|
|
|
71
22
|
has_patch_kombu_redis = False
|
|
@@ -211,7 +162,6 @@ Transport Options
|
|
|
211
162
|
self.conn.drain_events()
|
|
212
163
|
|
|
213
164
|
def _confirm_consume(self, kw):
|
|
214
|
-
pass # redis没有确认消费的功能。
|
|
215
165
|
kw['message'].ack()
|
|
216
166
|
|
|
217
167
|
def _requeue(self, kw):
|
|
@@ -44,7 +44,8 @@ class BrokerConnConfig(DataClassBase):
|
|
|
44
44
|
REDIS_PORT = 6379
|
|
45
45
|
REDIS_DB = 7 # redis消息队列所在db,请不要在这个db放太多其他键值对,以及方便你自己可视化查看你的redis db,框架里面有的功能会scan扫描unacked的键名,使用单独的db。
|
|
46
46
|
REDIS_DB_FILTER_AND_RPC_RESULT = 8 # 如果函数做任务参数过滤 或者使用rpc获取结果,使用这个db,因为这个db的键值对多,和redis消息队列db分开
|
|
47
|
-
|
|
47
|
+
REDIS_SSL = False
|
|
48
|
+
REDIS_URL = f'{"rediss" if REDIS_SSL else "redis"}://{REDIS_USERNAME}:{REDIS_PASSWORD}@{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}'
|
|
48
49
|
|
|
49
50
|
NSQD_TCP_ADDRESSES = ['127.0.0.1:4150']
|
|
50
51
|
NSQD_HTTP_CLIENT_HOST = '127.0.0.1'
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from apscheduler.jobstores.redis import RedisJobStore
|
|
2
|
-
from funboost.utils.redis_manager import RedisMixin
|
|
2
|
+
from funboost.utils.redis_manager import RedisMixin,get_redis_conn_kwargs
|
|
3
3
|
|
|
4
4
|
from funboost.timing_job import FunboostBackgroundScheduler
|
|
5
5
|
from funboost.funboost_config_deafult import BrokerConnConfig, FunboostCommonConfig
|
|
@@ -41,6 +41,21 @@ class FunboostBackgroundSchedulerProcessJobsWithinRedisLock(FunboostBackgroundSc
|
|
|
41
41
|
# return 0.1
|
|
42
42
|
|
|
43
43
|
def _process_jobs(self):
|
|
44
|
+
"""
|
|
45
|
+
funboost 的做法是 在任务取出阶段就加锁,从根本上防止了重复执行。
|
|
46
|
+
这个很关键,防止多个apscheduler 实例同时扫描取出同一个定时任务,间接导致重复执行,
|
|
47
|
+
在apscheduler 3.xx版本这样写来防止多个apscheduler实例 重复执行定时任务的问题,简直是神操作.
|
|
48
|
+
|
|
49
|
+
_process_jobs 功能是扫描取出需要运行的定时任务,而不是直接运行定时任务
|
|
50
|
+
只要扫描取出任务不会取出相同的任务,就间接的决定了不可能重复执行相同的定时任务了.
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
不要以为随便在你自己的消费函数加个redis分布式锁就不会重复执行任务了,redis分布式锁是解决相同代码块不会并发执行,而不是解决重复执行.
|
|
54
|
+
但funboost是神级别骚操作,把分布式锁加到_process_jobs里面,
|
|
55
|
+
_process_jobs是获取一个即将运行的定时任务,是扫描并删除这个即将运行的定时任务,
|
|
56
|
+
所以这里加分布式锁能间接解决不重复运行定时任务,一旦任务被取出,就会从 jobstore 中删除,其他实例就无法再取到这个任务了.
|
|
57
|
+
|
|
58
|
+
"""
|
|
44
59
|
if self.process_jobs_redis_lock_key is None:
|
|
45
60
|
raise ValueError('process_jobs_redis_lock_key is not set')
|
|
46
61
|
with RedisDistributedBlockLockContextManager(RedisMixin().redis_db_frame, self.process_jobs_redis_lock_key, ):
|
|
@@ -48,9 +63,8 @@ class FunboostBackgroundSchedulerProcessJobsWithinRedisLock(FunboostBackgroundSc
|
|
|
48
63
|
|
|
49
64
|
|
|
50
65
|
jobstores = {
|
|
51
|
-
"default": RedisJobStore(
|
|
52
|
-
|
|
53
|
-
username=BrokerConnConfig.REDIS_USERNAME, jobs_key='funboost.apscheduler.jobs',run_times_key="funboost.apscheduler.run_times")
|
|
66
|
+
"default": RedisJobStore(**get_redis_conn_kwargs(),
|
|
67
|
+
jobs_key='funboost.apscheduler.jobs',run_times_key="funboost.apscheduler.run_times")
|
|
54
68
|
}
|
|
55
69
|
|
|
56
70
|
"""
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
from funboost.utils.dependency_packages_in_pythonpath import add_to_pythonpath
|
|
7
7
|
|
|
8
|
-
from nb_log import (LogManager, simple_logger,
|
|
8
|
+
from nb_log import (LogManager, simple_logger, LoggerMixin, LoggerLevelSetterMixin,
|
|
9
9
|
LoggerMixinDefaultWithFileHandler,nb_print,patch_print,reverse_patch_print,get_logger)
|
|
10
10
|
|
|
11
11
|
# from funboost.utils.redis_manager import RedisMixin
|
|
@@ -13,7 +13,7 @@ from funboost.utils import decorators
|
|
|
13
13
|
|
|
14
14
|
def get_redis_conn_kwargs():
|
|
15
15
|
return {'host': BrokerConnConfig.REDIS_HOST, 'port': BrokerConnConfig.REDIS_PORT,
|
|
16
|
-
'username': BrokerConnConfig.REDIS_USERNAME,
|
|
16
|
+
'username': BrokerConnConfig.REDIS_USERNAME,'ssl' : BrokerConnConfig.REDIS_SSL,
|
|
17
17
|
'password': BrokerConnConfig.REDIS_PASSWORD, 'db': BrokerConnConfig.REDIS_DB}
|
|
18
18
|
|
|
19
19
|
|
|
@@ -26,11 +26,13 @@ def _get_redis_conn_kwargs_by_db(db):
|
|
|
26
26
|
class RedisManager(object):
|
|
27
27
|
_redis_db__conn_map = {}
|
|
28
28
|
|
|
29
|
-
def __init__(self, host='127.0.0.1', port=6379, db=0, username='', password=''):
|
|
30
|
-
self._key = (host, port, db, username, password,)
|
|
29
|
+
def __init__(self, host='127.0.0.1', port=6379, db=0, username='', password='',ssl=False):
|
|
30
|
+
self._key = (host, port, db, username, password,ssl)
|
|
31
31
|
if self._key not in self.__class__._redis_db__conn_map:
|
|
32
32
|
self.__class__._redis_db__conn_map[self._key] = redis5.Redis(host=host, port=port, db=db, username=username,
|
|
33
|
-
password=password, max_connections=1000,
|
|
33
|
+
password=password, max_connections=1000,
|
|
34
|
+
ssl=ssl,
|
|
35
|
+
decode_responses=True)
|
|
34
36
|
self.redis = self.__class__._redis_db__conn_map[self._key]
|
|
35
37
|
|
|
36
38
|
def get_redis(self) -> redis5.Redis:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: funboost
|
|
3
|
-
Version: 49.
|
|
3
|
+
Version: 49.6
|
|
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
|
|
@@ -24,6 +24,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
24
24
|
Classifier: Programming Language :: Python :: 3.11
|
|
25
25
|
Classifier: Programming Language :: Python :: 3.12
|
|
26
26
|
Classifier: Programming Language :: Python :: 3.13
|
|
27
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
27
28
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
28
29
|
Classifier: Topic :: Software Development :: Libraries
|
|
29
30
|
Description-Content-Type: text/markdown
|
|
@@ -73,9 +74,9 @@ Broker。funboost源码高扩展性的设计,造成“万物皆可为Broker”
|
|
|
73
74
|
框架对代码没有入侵,可以加到任意已有项目而对项目python文件目录结构0要求,
|
|
74
75
|
不像 celery django scrapy 这样的框架,要从一开始就开始规划好项目目录结构,如果不想用框架了,
|
|
75
76
|
或者想改变使用其他框架框架,那么已经所写的代码组织形式就几乎成了废物,需要大改特改.
|
|
76
|
-
但是funboost
|
|
77
|
+
但是funboost完全不会这样,不管是加上还是去掉@boost装饰器,对你的项目影响为0,用户照常使用,
|
|
77
78
|
所以用户可以对任意项目,任意时候,引入使用funboost或者去掉使用funboost,代码组织形式不需要发生变化.
|
|
78
|
-
(即使不想用funboost了,也不需要亲自去掉@boost
|
|
79
|
+
(即使不想用funboost了,也不需要亲自去掉@boost装饰器,因为函数上面有@boost装饰器对函数自身的直接调用运行没有任何影响,
|
|
79
80
|
用户照样可以直接例如 fun(x,y)是直接运行函数 , fun.push(x,y) 才是发送到消息队列)
|
|
80
81
|
|
|
81
82
|
通过funboost web manager 管理系统,支持全面 查看 监控 管理 funboost的任务消费。
|
|
@@ -70,7 +70,7 @@ setup(
|
|
|
70
70
|
'Programming Language :: Python :: 3.11',
|
|
71
71
|
'Programming Language :: Python :: 3.12',
|
|
72
72
|
'Programming Language :: Python :: 3.13',
|
|
73
|
-
|
|
73
|
+
'Programming Language :: Python :: 3.14',
|
|
74
74
|
# 'Programming Language :: Python :: 3.15',
|
|
75
75
|
# 'Programming Language :: Python :: 3.16',
|
|
76
76
|
# 'Programming Language :: Python :: 3.17',
|
|
@@ -82,7 +82,7 @@ setup(
|
|
|
82
82
|
'Topic :: Software Development :: Libraries'
|
|
83
83
|
],
|
|
84
84
|
install_requires=[
|
|
85
|
-
'nb_log>=13.
|
|
85
|
+
'nb_log>=13.7',
|
|
86
86
|
'nb_libs>=1.9',
|
|
87
87
|
'nb_time>=2.4',
|
|
88
88
|
"pymongo>=4.6.3", # 3.5.1 -> 4.0.2
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
# @Author : ydf
|
|
3
|
-
# @Time : 2023/8/8 0008 13:32
|
|
4
|
-
|
|
5
|
-
import abc
|
|
6
|
-
from funboost.consumers.base_consumer import AbstractConsumer
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class EmptyConsumer(AbstractConsumer, metaclass=abc.ABCMeta):
|
|
10
|
-
"""
|
|
11
|
-
空的消费者没实现,空的实现,需要搭配 boost入参的 consumer_override_cls 和 publisher_override_cls使用,或者被继承。
|
|
12
|
-
"""
|
|
13
|
-
def custom_init(self):
|
|
14
|
-
pass
|
|
15
|
-
|
|
16
|
-
@abc.abstractmethod
|
|
17
|
-
def _shedual_task(self):
|
|
18
|
-
raise NotImplemented('not realization')
|
|
19
|
-
|
|
20
|
-
@abc.abstractmethod
|
|
21
|
-
def _confirm_consume(self, kw):
|
|
22
|
-
raise NotImplemented('not realization')
|
|
23
|
-
|
|
24
|
-
@abc.abstractmethod
|
|
25
|
-
def _requeue(self, kw):
|
|
26
|
-
raise NotImplemented('not realization')
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/backup/async_pool_executor_janus.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/bounded_processpoolexcutor_gt_py37.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{funboost-49.4 → funboost-49.6}/funboost/concurrent_pool/concurrent_pool_with_multi_process.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|