python - AWS EC2 实例中 Python 多线程的意外行为 [更新]
问题描述
这是此处提出的问题的更详细版本
请帮助我理解为什么当我在本地机器和 AWS EC2 实例上运行我的项目时会得到不同的结果。
我正在使用 python 多线程在我的 Django Web 应用程序中实现并发和并行性。当用户从前端请求一个工作流时,我可以创建一个新的工作流。可以有多个工作流在后台一起运行,每个工作流使用自己的线程。
视图.py
def request_for_new_workflow(request):
...
thread_id = unique_id_for_this_request
thread_obj = threading.Thread(target=handler.some_function, name=str(thread_id), args=my_args)
handler.allThreads[thread_id] = {}
handler.allThreads[thread_id]['object'] = thread_obj
handler.allThreads[thread_id]['isAllowed'] = True
...
return HttpResponse("New Workflow Started", status=200)
def stop_workflow(request):
thread_id = request.POST.get('id')
if thread_id in handler.allThreads: <-------------------- Error Here
handler.allThreads['create-event-workflow-'+id]['isAllowed'] = False
return HttpResponse("Workflow Stopped", status=200)
handler.py包含许多将直接从视图调用的函数(每个请求只有一个)。根据传递的参数,每个函数可能需要数小时才能完成。(大部分时间被 time.sleep 消耗)。这里的所有函数都是 I/O 密集型的,而不是 CPU 密集型的。此外,allThreads
保存有关任何线程的数据的字典也存在于该文件中。
allThreads = {}
# Structure of allThreads when it contains workflows:
# allThreads = {
# 'unique_id' : {
# 'object' : Thread_Object,
# 'isAllowed' : Boolean
# },
# ...
# }
def some_function_1(args): # can run for hours (in background) after getting a request from user
...
while(conditions): # can run for a few 100 times
# do I/O intensive tasks (usually takes a few seconds)
time.sleep(anywhere between a few seconds to few minutes)
...
# make changes to DB
handler.allThreads中的错误if thread_id in handler.allThreads:
要么为空,要么包含不完整的工作流列表。工作流随机地从 handler.allThreads
.
我不明白为什么会这样。唯一的区别是两台机器(本地和 AWS 服务器)的配置。
本地机器配置 - CPU- 第 8 代 i5-8250U,RAM- 8GB,成功率:~100%
服务器配置 1 - (t2.small) - vCPU-1,RAM-2GB,成功率:~10%
服务器配置 2 - (c5a.xlarge) - vCPU-4,RAM-8GB,成功率:~80%
请帮我理解这个问题,我该如何解决这个问题?您会推荐哪种配置/服务器?任何帮助表示赞赏..提前谢谢你
解决方案
推荐阅读
- blazor - 具有扩展功能的 EditForm,无需编写 html 部分
- python - [更新]Google 搜索 Python 模块
- r - R:使用 dir() 函数提取文件,并在矩阵中识别模式
- android - 即使在终止应用程序后仍运行的 Android 服务
- python - python比较两个列表并保留第二个列表索引
- python - 用于 python 的 Azure 函数无法访问
- jmeter - Apache-JMeter 5.4
- sql - 如何使用sql提取具有重叠时间的行
- vue.js - 在 vuejs 中“安装”之前获取子 DOM 元素高度
- mongodb - 编写一个 Bash shell 脚本来读取 mongodb 日志文件并将其内容写入另一个文本文件