1. 业务逻辑导致的死锁
这个是最常见的了,不过只要把逻辑梳理好,就不容易出现这个情况,不过注意:最好不要手动的定义一个变量,来判断是否需要用到同步锁。
- 比如:定义一个变量
needLockFunc
或has_lock_func
这种,然后防止死锁时判断这个变量是True或False,后续的逻辑中有用到的地方,然后判断变量,需要时手动设置为True,用完设置为False。阶段性的编码结束后,大概率就把这种变量忘啦!纯粹给自己挖坑啊
2. 子进程找不到变量
子进程里各种父进程中定义的变量都是没有的,通常会把子进程写成函数,然后多进程运行这个函数,可以避免很多错误,但是仍旧有些地方需要注意:
- 比如用到了自定义的日志模块,但是子进程中却没有这个logger,会导致使用logger的时候直接报错,子进程无法继续执行,但是报错的是日志模块,所以日志模块自己不会把错误写到自己的记录中。最后导致日志也没错,进程也没执行结果
3. 数据库连接超时
当时是在父进程中建立Mysql数据库的连接池,交给子进程后,子进程处理完成需要保存数据时无法使用这个连接池,因为连接池的连接创建但长时间未使用时Mysql会主动断开这个链接,结果子进程运气不好选了一个被断开的连接的时候就会报一个Error Code: 2013. Lost connection to MySQL server during query
的报错。所以最好在子进程需要用到数据库时在子进程中创建连接,不要把父进程当成指挥棒,而要就功能来函数划分。