【问题标题】:Why would my server spawn two threads in response to one Http POST?为什么我的服务器会产生两个线程来响应一个 Http POST?
【发布时间】:2019-05-12 12:52:22
【问题描述】:

所以...谁喜欢侦探工作,倾注于日志记录???这是我们中间的侦探!

我们的一位用户表示,他们在我们的网站上进行测验时遇到了错误页面。下面我附上我们服务器日志中与他们报告的时刻相关的一些文本。

我认为第三列(8 或 9)是指服务器上的线程。因此,在 07:36:31,用户正在通过一系列函数调用为他们准备 HTML 响应,以响应用户的 POST(回答之前的测验问题)。

但由于某种原因,在用户于 07:36:44 进行第二次 POST 后,服务器似乎生成了两个并行运行的线程,以响应我认为的单个 POST 请求。

您可以在最后看到错误及其原因。对于第一个线程 (8),一个条目被保存到数据库中。当第二个线程在几毫秒后到达该点时,我们会收到完整性错误,因为具有该键的记录已经存在(感谢线程 8)。

我以前从未遇到过这个问题。关于为什么突然我们的服务器决定突然产生两个线程导致意外的竞争条件的任何想法??

我的技术栈: * Heroku 服务器 * Django python web 框架

07:36:31 : 95.XX.67.113      https:POST   status:200  "/en/main/"
..<snip>..
07:36:31 : wrappers       9  INFO   : User Aysegul: starting main.views.quiz_class.ask_quiz_question    
07:36:31 : wrappers       9  INFO   : User Aysegul: starting grammar.views.assess.run_quiz
07:36:31 : wrappers       9  INFO   : User Aysegul: starting main.views.quiz_class.get_next_scheduled_q
07:36:31 : wrappers       9  INFO   : User Aysegul: starting main.views.quiz_class.ask_quiz_question
07:36:44 : 95.XX.67.113      https:POST   status:200  "/en/main/"
07:36:44 : wrappers       8  INFO   : User Aysegul: starting main.views.main.switchboard
07:36:44 : wrappers       9  INFO   : User Aysegul: starting main.views.main.switchboard
07:36:44 : wrappers       8  INFO   : User Aysegul: starting main.views.main.load_session_data
07:36:44 : wrappers       9  INFO   : User Aysegul: starting main.views.main.load_session_data
07:36:44 : user_profile   8  DEBUG  : Model UserProfile Instance saved:[<User: Aysegul>]
07:36:44 : main           8  DEBUG  : Aysegul switchboard - returning control back to run_quiz
07:36:44 : wrappers       8  INFO   : User Aysegul: starting grammar.views.assess.run_quiz
07:36:44 : user_profile   9  DEBUG  : Model UserProfile Instance saved:[<User: Aysegul>]
07:36:44 : main           9  DEBUG  : Aysegul switchboard - returning control back to run_quiz
07:36:44 : wrappers       9  INFO   : User Aysegul: starting grammar.views.assess.run_quiz
07:36:44 : wrappers       8  INFO   : User Aysegul: starting main.views.quiz_class.record_answer
07:36:44 : wrappers       9  INFO   : User Aysegul: starting main.views.quiz_class.record_answer
07:36:44 : wrappers       8  INFO   : User Aysegul: starting main.views.quiz_class.question_feedback
07:36:44 : log            9  ERROR  : Internal Server Error: /en/main/
07:36:44 : Traceback (most recent call last):
07:36:44 :   File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 85, in _execute
07:36:44 :     return self.cursor.execute(sql, params)
07:36:44 : psycopg2.IntegrityError: duplicate key value violates unique constraint "grammar_entry_question_id_text_d90c1
7cd_uniq"
07:36:44 : DETAIL:  Key (question_id, text)=(1385, Üç günden beri hasta oluyor) already exists.

附:有趣的是,这个问题也发生在 heroku/django 组合中...... Heroku one request spawns two responses that crashes my app

【问题讨论】:

    标签: django multithreading heroku django-views


    【解决方案1】:

    看了一圈,我想答案是这样的:

    Heroku 的路由器可能偶尔会出现故障,并为单个接收到的请求生成两个响应线程。这很不幸,但幸运的是很少见。

    一个潜在的解决方案可能是让您的后端代码检查用户的请求线程是否已经在进行中(例如,通过将时间戳写入数据库或共享通用缓存)。如果另一个线程正在进行中,则后一个线程可能会退出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      相关资源
      最近更新 更多