python多进程存数据不改变顺序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多进程存数据不改变顺序相关的知识,希望对你有一定的参考价值。

参考技术A 你的问题太模糊了。我先从常见的错误说,然后再从相对从大的方面来描述。

进程挂掉可能是什么原因?

一方面是程序可能有逻辑错误,导致了诸如下标越界,数据异常等问题。

另一方面,可能是系统原因,比如代码质量一般,系统资源消耗厉害,进程退出。

还有可能是上下游服务问题,比如 mysql 等服务异常,上游 API 异常,配置错误。

简单说了下各种可能的异常,但对一个项目而言,天下问题千千万,不可能有一条完美的准则。

遇到问题,通常要从几步出发,从排查出错原因、寻找解决方案和如何预防出发。

排查错误的原因,这是最重要的一步,只有对症下药才能解决问题。

首先确认下是否容易复现的问题,容易复现的话,通常会给出错误信息。然后,我们只要在开发时调试下就好了,常见的调试方法有 print 打印来观察问题,或者是使用一些 debug 调试工具,我相信你会用。print 的特点是简单好用,但每次都有修改代码,比较繁琐。而调试工具就比较方便,看的信息会比较全,一些 IDE 都集成了调试工具。

对于不容易复现的问题,可以通过记录日志的方式排查。有人会说,记录日志是资源消耗,曾经我也怎么想过。但对于现在的硬件配置而已,记录日志的成本是非常小的,一个好像的项目肯定是集成日志的,不然就太 low 逼了,我可不敢用。

寻找解决方案,这一步需要基于前面诊断出的结果进行排查。

一个简单的案例。比如,提示 MySQL 连接数过多,什么情况可能导致这个问题?是 MySQL 配置的连接数本身就很少,还是程序设计不合理导致连接无法正确复用,亦或是业务量真的大了,当前最大连接数无法承受呢。每种情况的处理方式都不同。

如何预防问题,我主要想学详细的日志,和增加一些恢复机制。

详细的日志就不说了,异常要记得捕获,并且记录发生异常的原因,这一步对排查问题非常有帮助。

另外,不是所有的异常都应该立刻退出进程,如果不是一些非常严重的错误,通过日志提示下,程序还可以继续工作。不过,有些异常还是要做一些修复处理,比如数据库连接断开,可尝试重新连接,上游系统服务异常,可以执行多次调用,而不是直接退出。

就简单说这么多吧!如果有些地方讲的不是很好,见谅。欢迎评论补充,谢谢!

Python爬虫编程思想(139):多线程和多进程爬虫--线程锁

        多线程的目的就是让多段程序并发运行,但在一些情况下,让多段程序同时运行会造成很多麻烦,如果这些并发运行的程序还共享数据的话,有可能会造成脏数据以及其他数据不一致的后果。这里的脏数据是指由于多段程序同时读写一个或一组变量,由于读写顺序的问题造成了最终的结果与我们期望的不一样的后果。例如,有一个整数变量n,初始值为1,现在要为该变量加1,然后输出该变量的值,目前有两个线程(Thread1和Thread2)做同样的工作。当Thread1为变量n加1后,这时CPU的计算时间恰巧被Thread2夺走,在执行Thread2的线程函数时又对变量n加1,所以目前n被加了两次1,变成了3。这时不管是继续执行Thread2,还是接着执行Thread1,输出的n都会等于3。这也就意味着n等于2的值没有输出,如果正好在n等于2时需要做更多的处理,这也就意味着这些工作都不会按预期完成了,因为这时n已经等于3了。我们把这个变量当前的值称为脏数据,就是说n原本应该等于2的,而现在却等于3了。这一过程可以看下面的线程函数。

n = 1
# 如果用多个线程执行fun函数,就有可能造成n持续加1,而未处理的情况
def fun()
    n += 1
    print(n)  # 此处可能有更多的代码

        

以上是关于python多进程存数据不改变顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何在python上多进程处理数据

如何在python上多进程处理数据

python 使用多进程实现并发编程/使用queue进行进程间数据交换

python 多进程

Python进阶 - 多线程多进程基础

Python爬虫编程思想(139):多线程和多进程爬虫--线程锁