python多进程

  最近学习了一下python中的多进程,就先写一下关于python中的多进程吧。

  1. 首先介绍一下关于在ipython中进行的pdb调试,虽然现在几乎所有的IDE都可以进行调试,但是个人觉得多学一点总归没错的,所以先介绍一下关于在ipython中用pdb进行调试的方法。

    (1)对于一个.py的文件,首先使用下面的命令进行打开pdb调试的窗口,打开之后如下图所示:

        

     这里写了一个简单的some.py的文件,想要查看文件的内容,就可以在pdb的窗口写上 l 就可以了,如下图所示,所以 l 是用来显示程序:

        

    (2) 在这里可以看到程序的第一行有一个箭头,说明程序在开始调试之前是处在第一行的,要想程序接着向下执行,只需要在控制台输入 n 即可向下调试一行:

        

      因为python的解释器在执行代码的时候,遇到def定义的函数时,会自动跳过执行这段代码,所以箭头才会指向第四行,在第四行result接收的是一个函数的返回值,所以如果想要查看some这个函数的执行过程,就可以使用s命令进入到这个函数内部,如下图:

        

        可以看到箭头指向了some函数内部的第一行,在函数内部和在函数外部一样,都是使用n来进行调试下一行。

      (3)设置断点。使用 b + 行号 来确定在第几行设置断点。

        

        c可以执行全部的代码,设置断点之后,如果在执行c命令,那么程序就会在设置断点的地方停止,而不会直接执行到程序最后一行。使用clear + 第几个断点  就可以删除断点。这里的第几个断点是如下图所示的Breakpoint 后面的数字,如果是1,就clear 1,如果是2 ,就clear 2.

        

      (4)可以使用命令a来打印出所有形参的数据的值,如在本例子中,形参有a,b,那么使用命令a就可以查看出a,b的值,如下所示:

        

      (5)q退出调试:

        

  2.  python中的进程。在python中创建进程的方式有三种,分别是使用fork()、 Process 、以及进程池。接下来就分别介绍一下三种方式。

    (1)使用fork()创建多进程:

      

      使用fork()创建的子线程默认的值是0,所以在输出的时候,子线程会执行三个print语句,主线程只需执行else中的语句。

    (2)使用multiprocessing模块:

      

      使用Process类之前需要先进行导入,导入之后,需要创建Process类的对象,括号中的target代表的是定义的函数的 名称,然后使用p.start()来启动进程。p.join()的意思是主进程等待子进程执行结束之后在结束。

 

    (3)进程池:

      使用进程池首先需要导入进程池模块:

    

      然后利用Pool这个类创建一个对象:pool = Pool(4),括号中的数字代表你当前进程池所能执行任务的最大数量,也就是4个,这个数字的选择要根据许多条件来进行判断的,不是说一个进程池中的任务越多越好,也不是越少越好,要根据程序本身的性能来进行判断。创建完成对象之后,就可以使用pool.apply_async(worker,i)来向进程池中添加任务了。这里的worker指的是函数的名字,后面的i代表worker中的形参。添加完任务之后,需要在后面close一下,也即pool.close()。所以使用进程池的总的步骤就可以按照以下的命令:

      

      这段代码的意思是有10个任务,但是每次最多只能执行4个任务,任务的执行过程是在worker函数里面实现的执行完成之后,就关闭进程池。

 

 

        

    

 

 

 

        

 

 

 

        

    

        

 

posted on 2018-01-24 14:08  li_ling  阅读(207)  评论(0编辑  收藏  举报