python-3.x - 将 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 是一个好主意 - 是一个新任务(新线程)。也许值得以某种方式将它们排在队列中?也许最好的选择是每次都创建一个常规流?
解决方案
每次创建 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 还是很陌生。
推荐阅读
- ruby-on-rails - 如何使用 rubyXL gem 获取特定值单元格索引
- python - 如何按顺序写入文本框
- python - 将句子中的所有数字单词翻译成数字
- python - 在 informatica 服务器上安装 python Jupyter notebook 或 anaconda navigator
- android - Android:如何更改自定义复选框的默认颜色?
- mysql - MySQL 搜索基于 JSON 文档中另一个键的键值对
- c# - 每个部分 c# dotnet 核心的多个模型
- netbeans - 可以使用 Image 作为 jProgressBar 填充物吗?
- django - 使用 pghistory 跟踪 Django 的默认用户模型中的用户模型更改
- python - 如何使用具有特定前缀的所有函数动态填充数组?