首页 > 解决方案 > 将 ThreadPoolExecutor 与一名工作人员一起使用是个好主意吗?

问题描述

我有一个简单的休息服务,可让您创建任务。当客户端请求一个任务时——它返回一个唯一的任务号并开始在一个单独的线程中执行。实现它的最简单方法

class Executor:
    def __init__(self, max_workers=1):
        self.executor = ThreadPoolExecutor(max_workers)

    def execute(self, body, task_number):
        # some logic
        pass

def some_rest_method(request):
    body = json.loads(request.body)
    task_id = generate_task_id()
    Executor(max_workers=1).execute(body)
    return Response({'taskId': task_id})

如果我知道一个请求,那么每次使用一个(!)工作人员创建 ThreadPoolExecutor 是一个好主意 - 是一个新任务(新线程)。也许值得以某种方式将它们排在队列中?也许最好的选择是每次都创建一个常规流?

标签: python-3.xmultithreadingpython-multiprocessingpython-multithreadingthreadpoolexecutor

解决方案


每次创建 ThreadPoolExecutor 是否是个好主意...

不,这完全违背了线程池的目的。使用线程池的原因是您不会为每个请求创建和销毁新线程。创建和销毁线程是昂贵的。线程池的想法是它使“工作线程”保持活动状态并为每个下一个请求重新使用它/它们。

...只有一根线

单线程执行器有一个很好的用例,尽管它可能不适用于您的问题。用例是,您需要“在后台”执行一系列任务,但您还需要按顺序执行它们。单线程执行器将按照提交的顺序一个接一个地执行任务。

也许值得以某种方式将它们排在队列中?

您已经它们排在队列中。每个线程池都有一个待处理任务队列。executor.execute(...)当您提交将任务放入队列的任务(即)时。


什么是最好的方法......在我的情况下?

一个简单的服务器的骨架看起来像这样(伪代码):

POOL = ThreadPoolExecutor(...with however many threads seem appropriate...)

def service():
    socket = create_a_socket_that_listens_on_whatever_port()
    while True:
        client_connection = socket.accept()
        POOL.submit(request_handler, connection=connection)

def request_handler(connection):
    request = receive_request_from(connection)
    reply = generate_reply_based_on(request)
    send_reply_to(reply, connection)
    connection.close()

def main():
    initialize_stuff()
    service()

当然,我遗漏了很多细节。我不能为你设计。尤其是在 Python 中。我用其他语言编写过这样的服务器,但我对 Python 还是很陌生。


推荐阅读