python:记工作中的一些在搜索引擎上不太好找到bug(一)

前言
  • 不定时更新
  • 选择记录的原因有以下两个:
    • 相关问题在搜索引擎上基本上搜索不到有效的答案。
    • 错误错的很有意义。
  • 文章中会有很少的代码片。(这是因为我所在的这家公司保密机制做的很严格,我需要尊重它)
  • 关于每个问题我重在记录和指导
  • 我会在每个问题的最后我会选择性的记录一些:你可能不知道,但是有必要知道的小知识点
第一个:Django项目中生成迁移表或者在进行pytset测试时报出某个model不能正常解析的时候。
  • 一般这种情况是因为频繁的更改表关系导致的,而主要的原因是:外键关系不能得到很好的体现
  • 我们分两种情况来看:
    • 生成迁移表的时候(解决方法有两种
      1、如果你的公司不要求你们每次push代码的时候需要保证每个app中至多增加一个迁移文件的话,那么你可以先执行empty操作,然后再执行python manage.py makemigrations 和 python manage.py migrate
      2、你需要去迁移文件中修改一个(准确来说是增加一行代码,表明其关系)。也是是在下面这个列表中添加一个表明关系的元祖(链接到外键指向的那个迁移文件即可
       dependencies = [
            ('courses', '0009_auto_20191206_1616'),
        ]
    
    • pytest时出现该问题。(解决方法只有一种:上述的第二种
      • 出现该问题时的表现:你的后台接口可以正常访问,但是pytest的mark.django_db装饰器会报出解析错误。
      • 解决方法:是时候去手动修改迁移文件了。
  • 补充
    • 对于装饰器而言,当程序加载其所在的模块时,它就已经执行了。所以不要为那些找不到源头的错误太过担心,因为那可能是装饰器的原因。
第二个:django项目中使用进程池优化代码效率时,未报错,但反馈的数据存在差异时。(非资源竞争等常见问题)
  • 这个错误我准备明天记录(也许明天也搞不定呢?哈哈),因为我在块下班的时候才定位到错误是在哪。(2020-04-22)
  • 好的,最近太忙了,今天得空更新一下(2020-04-26)。

  • 正文:
  • 使用进程池的时候是不能看到哪个进程中的异常的,所以我用了普通的形式开多进程(也就是两个for循环,一个start,一个join的那种),然后定位到错误在数据库上。
  • 开发环境用的是sqlite3,我以为是sqlite3扛不住并发查询,所以我换了线上环境postgreSQL试了试,本以为就会得到解决的,但实际上是没有的,而且报错各式各样的,不过可以肯定的是所有的错误都是在执行sql语句的时候出的问题。
  • 于是我想到可能是sql连接池的问题…好吧很逼近了。
  • 真正的问题在于进程中开启多个子进程的时候它们会copy同一个sql连接,于是出现了:这个子进程的查询语句的结果还没返回,另外一个子进程使用了这个连接进行了查询操作。所以肯定会报错的。
  • 解决方案是:在每个子进程start之前关闭之前的老连接。也就是:
from django import db
db.close_connection()
  • 但是这样有一个不好的地方是无法使用进程池,所以我又自己造了个进程池,(核心思想是:维持一个 进程queue 存在小于4的长度即可)。

  • 补充:

    • 其实我是非常不想用多进程的,但是实在没办法。
    • 我这样说的目的是,当你遇到处理数据影响性能的时候,你可以首先考虑:分组聚合操作(django在这方面做的是很不错的)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值