Gradio Agents 和 MCP 黑客马拉松

获奖者
Gradio logo
  1. 附加功能
  2. 排队

排队

每个 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 应用的排队行为变得容易。