Python 为什么线程死了/阻塞了?

Python 为什么线程死了/阻塞了?,python,multithreading,Python,Multithreading,我编写了一个函数collect_data使用4个线程从4个网站(比如网站a到d)收集数据,同时更新mysql表中的数据; 表中有4个字段,每个字段存储来自一个网站的数据 4个线程更新表时不使用锁。 这4个线程每10秒在mysql中收集数据并更新数据 def collect_data(site_list = ['a', 'b', 'c', 'd']): for site in site_list: InfoCollectingThread(site).start() 不

我编写了一个函数collect_data使用4个线程从4个网站(比如网站a到d)收集数据,同时更新mysql表中的数据; 表中有4个字段,每个字段存储来自一个网站的数据 4个线程更新表时不使用锁。 这4个线程每10秒在mysql中收集数据并更新数据

def collect_data(site_list = ['a', 'b', 'c', 'd']):
     for site in site_list:
        InfoCollectingThread(site).start()
不幸的是,经过一段时间的运行(比如3小时),mysql中没有新记录。 似乎有些线程提前终止,因为相应的字段没有提前更新

我的问题是,在我的设计过程中存在什么问题,有什么解决方案?
圣诞快乐。

可能的原因太多,信息太少,我们无法做出明智的猜测。我可以为您提供一些解决此问题的建议:

  • 将调试输出添加到线程的事件循环中,以便更好地了解它们在做什么
  • 在所有线程函数周围添加异常处理(例如,一个
    try
    -
    finally
    部分),也包括调试输出。这样,如果一根线死了,你就知道了
  • 添加一个信号处理程序,它将打印出所有活动线程的堆栈跟踪,并在出现故障后使用它检查程序的状态。您可以找到一些有用的代码

老实说,有太多的可能性,我们会在黑暗中冒险。你是诗人,但我想寻找可能的原因。可能的原因:很多。首先,用一个线程测试它。如果这不起作用,那么您就消除了多线程问题,并且调试起来更容易。如果它确实起作用,你需要看看你的线程。例如,mysql模块是线程安全的吗?如果你不知道,那么最好假设它不是,并使用一些锁。顺便说一句,我注意到你正在使用一个列表作为默认-这可能没有你想要的效果。Python不会在每次调用函数时创建一个新的列表,它在每次默认调用时都使用相同的列表对象。至少你有一个硬块,当症状是间歇性的时,情况会更糟。您消除数据库等项的方法很好,请继续。您需要找到线程被阻塞时正在执行的代码行。你有哪些阻塞呼叫?如果你不认为你有,那么考虑一下通信和IPC,我会听从你的建议去找出答案。