【问题标题】:Is at a good idea to use ThreadPoolExecutor with one worker?将 ThreadPoolExecutor 与一名工作人员一起使用是个好主意吗?
【发布时间】:2021-03-16 18:55:37
【问题描述】:

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

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 和一个(!)工作人员是一个好主意 - 是一个新任务(新线程)。也许值得以某种方式将它们排在队列中?也许最好的选择是每次都创建一个常规流?

【问题讨论】:

  • 您的示例看起来可能有一个严重的错误。它返回Response(...) 而无需等待“单独的线程”完成对请求的处理。它甚至可能发生在单独的线程甚至 开始 处理请求之前。这就是你的意思吗?如果没有,那么修复它的最佳方法可能是让线程返回Response(...)
  • 哦,对不起,当然不是。在下面的评论中写下了我的问题

标签: python-3.x multithreading python-multiprocessing python-multithreading threadpoolexecutor


【解决方案1】:

是不是每次都创建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 还是很陌生。

【讨论】:

  • 在我的情况下使用线程的最佳方式是什么?我有一个 rest 方法,它为客户端提供一个唯一的 taskId 并开始执行任务。客户端通过 taskId 轮询任务状态,直到完成。一旦它完成 - 他要求一个身体。客户端多时如何正确实现?
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
相关资源
最近更新 更多