1. 附加功能
  2. 队列

队列

每个 Gradio 应用程序都内置了一个队列系统,可以扩展到数千个并发用户。由于许多事件监听器可能涉及繁重处理,Gradio 会自动创建队列来处理后端中的每个事件监听器。应用程序中的每个事件监听器都会自动拥有一个队列来处理传入的事件。

配置队列

默认情况下,每个事件监听器都有自己的队列,每次处理一个请求。可以通过两个参数进行配置

  • concurrency_limit: 这设置了事件监听器的最大并发执行数。默认情况下,限制为 1,除非在 Blocks.queue() 中另行配置。您也可以将其设置为 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" 标识的队列。如 concurrency_limit 所定义,队列一次最多可以处理 2 个并发请求。

注意事项

  • 要确保事件监听器具有无限并发性,请设置 concurrency_limit=None。如果您的函数正在调用例如外部 API,而该 API 本身处理请求速率限制,则此功能非常有用。
  • 所有队列的默认并发限制可以使用 Blocks.queue() 中的 default_concurrency_limit 参数进行全局设置。

这些配置使您可以轻松管理 Gradio 应用程序的排队行为。

gradio