首页 > 解决方案 > 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%

请帮我理解这个问题,我该如何解决这个问题?您会推荐哪种配置/服务器?任何帮助表示赞赏..提前谢谢你

标签: pythonmultithreadingamazon-web-servicesamazon-ec2python-multithreading

解决方案


推荐阅读