每个Gradio应用都自带一个内置的排队系统,可以扩展到数千个并发用户。因为你的许多事件监听器可能涉及繁重的处理,Gradio会自动创建一个队列来处理后端中的每个事件监听器。你的应用中的每个事件监听器都会自动拥有一个队列来处理传入的事件。
默认情况下,每个事件监听器都有自己的队列,一次处理一个请求。这可以通过两个参数进行配置:
concurrency_limit: 这设置了事件监听器的最大并发执行数。默认情况下,除非在Blocks.queue()中另行配置,否则限制为1。你也可以将其设置为None表示无限制(即无限数量的并发执行)。例如:import gradio as gr
with gr.Blocks() as demo:
prompt = gr.Textbox()
image = gr.Image()
generate_btn = gr.Button("Generate Image")
generate_btn.click(image_gen, prompt, image, concurrency_limit=5)在上面的代码中,此事件监听器最多可以同时处理5个请求。额外的请求将被排队,直到有空闲的插槽可用。
如果你想使用共享队列管理多个事件监听器,你可以使用concurrency_id参数:
concurrency_id: 这允许事件监听器通过分配相同的ID来共享一个队列。例如,如果你的设置只有2个GPU,但多个函数需要访问GPU,你可以为所有这些函数创建一个共享队列。以下是可能的样子:import gradio as gr
with gr.Blocks() as demo:
prompt = gr.Textbox()
image = gr.Image()
generate_btn_1 = gr.Button("Generate Image via model 1")
generate_btn_2 = gr.Button("Generate Image via model 2")
generate_btn_3 = gr.Button("Generate Image via model 3")
generate_btn_1.click(image_gen_1, prompt, image, concurrency_limit=2, concurrency_id="gpu_queue")
generate_btn_2.click(image_gen_2, prompt, image, concurrency_id="gpu_queue")
generate_btn_3.click(image_gen_3, prompt, image, concurrency_id="gpu_queue")在这个例子中,所有三个事件监听器共享一个由"gpu_queue"标识的队列。该队列一次最多可以处理2个并发请求,如concurrency_limit所定义。
concurrency_limit=None。如果您的函数正在调用例如处理请求速率限制的外部API,这将非常有用。Blocks.queue()中使用default_concurrency_limit参数全局设置。这些配置使得管理您的Gradio应用程序的排队行为变得容易。