Python抛出随机KeyError。可能缺乏计算能力吗?

时间:2016-03-25 14:54:40

标签: python amazon-ec2 python-3.4 keyerror

我一直得到最奇怪的关键错误'在生产中运行我的脚本时。这很奇怪,因为在开发过程中我没有收到任何错误。

我创建了一个' try-except'阻止捕获错误,但字典似乎一切正常。没有密钥丢失。这很奇怪,因为有时for循环挂在它的中间,或者有时抛出异常(即使它是完全相同的输入)。

我使用的是Python 3.4,机器之间的区别是:

  • 生产(AWS' EC2微型实例)仅使用1个CPU(CPU0)和1GB RAM,并使用3名Gunicorn工人。
  • 开发机器有3个CPU(CPU0,CPU1,CPU2),1 GB RAM并使用3个Guniorn工作人员(最多9个)。

以下是我的代码的过度简化。我的真正的类有26个属性,其中两个是动态生成的HTML SVG代码。此外,词典列表的长度可以是0到100之间的任何内容(在开发中我使用较小的词典列表(即10)):

class myObject(object):
  self.id = id
  self.alias = alias

def get_me_objects(list_of_dicts):

  try:

    objects_list = []

    print('Entering the faulty for loop...')

    for i in range(len(list_of_dicts)):
        id = list_of_dicts[i]['id']
        alias = list_of_dicts[i]['alias']

        obj = myObject(id, alias)

        print('obj.id:' + str(print(obj.id)))
        print('len(obj.__dict__):' + str(len(obj.__dict__)))

        objects_list.append(obj)

   except:
       print('')
       print('The following exception ocurred:')
       e = sys.exc_info()[0]
       print(e)
       print('obj.id:' + str(obj.id))
       print('len(obj.__dict__):' + str(len(obj.__dict__)))
       print('obj.___dict__:' + str(obj.__dict__))

  print('')
  print('Returning objects_list')      
  print(objects_list)
  return objects_list

当我以此作为输入运行时:

get_me_objects([{'id': 1009, 'alias': 'b'}, {'id': 8888, 'alias': 'c'}, {'id': 7778, 'alias': 't'}]

.... 趋向给我这个输出......

Entering the faulty for loop...
obj.id: 1009
len(obj.__dict__): 2
obj.id: 8888
len(obj.__dict__): 2

The following exception ocurred:
<class 'KeyError'>
obj.id: 8888
len(obj.__dict__): 2
obj.___dict__: {'alias': 'c', 'id': 8888}       

Returning objects_list
[<app.views.my_scripts.MyObject object at 0x7f9c4c464198>, <<app.views.my_scripts.MyObject object at 0x7f9c4c46db38>]

...如果我再次重试,它有时会给我这个输出(即使有相同的词典列表!)...

Entering the faulty for loop...

...奇怪的是,如果我有时再次重试它可以给我这个输出(即使有完全相同的词典列表!):

Entering the faulty for loop...
obj.id: 1009
len(obj.__dict__): 2

The following exception ocurred:
<class 'KeyError'>
obj.id: 1009
len(obj.__dict__): 2
obj.___dict__: {'alias': 'a', 'id': 1009}       

Returning objects_list
[<app.views.my_scripts.MyObject object at 0x7f9c4c464198>]

所以我怀疑这个问题与CPU电脑电源有关。或者也许在某个地方存在一个问题,在我的生活中,我无法看到它。我还能做些什么来解决这个问题?

更新1.0

Rob提出了一个重要的观点,要求我删除try-except块以查看完整的回溯。我添加try-except块的原因是因为Gunicorn没有向我展示任何东西。一旦找到获得追溯的方法,我就会立即更新我的帖子。

更新2.0

按照Rob的建议我检查回溯(很明显!),发现有一个有效的KeyError来自另一个函数,它来自for循环。它没有被注意到,因为首先,功能的名称伪装成类似的变量名称,其次,由于看似随机的&#39;而我严重分心。我一直从字典中得到的行为:

'In what order does python display dictionary keys?'):

  

订单与内部工作方式以及它们在哈希表中的结束顺序有关。这又取决于密钥哈希值,它们的插入顺序以及您正在使用的Python实现。

     

顺序是任意的(但不是随机的),知道它将是哪个顺序永远不会有用。

     

要获取按键的排序列表,只需使用已排序(D),在您的情况下将返回[&#39; a&#39;,&#39; b&#39;,&#39; c&#39 ]。

我的坏。无论如何,感谢大家的帮助!

1 个答案:

答案 0 :(得分:1)

按照Rob的建议,我检查了追溯(呃!),发现有一个有效的KeyError来自另一个函数,来自for循环。

这个错误没有引起注意(对我来说无论如何)因为首先,函数的名称伪装成类似的变量名称,其次,我期待看到Gunicorn输出中的追溯(但它没有发生) ),第三,我因为看似随意的而感到非常分心。我一直从字典中获取的行为。提醒:

'In what order does python display dictionary keys?'

  

订单与内部工作方式以及它们在哈希表中的结束顺序有关。这又取决于密钥哈希值,它们的插入顺序以及您正在使用的Python实现。

     

顺序是任意的(但不是随机的),知道它将是哪个顺序永远不会有用。

     

要获取按键的排序列表,只需使用已排序(D),在您的情况下将返回[&#39; a&#39;,&#39; b&#39;,&#39; c&#39 ]。