Gradio 月活用户突破 100 万!

阅读更多
Gradio logo
  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" 标识的队列。该队列一次最多可以处理 2 个并发请求,如 concurrency_limit 所定义。

注释

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

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