摘要
由于cpython全局锁(GIL)的存在导致python多线程技术没有太大的意义,所以很多程序员都喜欢采用多进程技术,来提高程序的运行效率,在linux中采用fork()来创建子进程,当然在Windows平台上fork()是不支持的,难道在Windows平台上就不可以多进程?当时不是,这次引入一个模块multiprocessing,关于这个模块的详情,可以访问官方文档,进行学习,这里只记录下本人的学习笔记。
程序进程是谁创建的?
我们在编写一个python程序,那么他的进程是由谁创建的,换句话说父进程是谁?这是一个有趣的问题,这是一个很深奥的问题....那么这里我们言归正传,python程序,单进程是他的父进程应该是python ide,当然这里ide有很多,我这里使用的是pycharm,所以说,当一个进程被创建,他的父进程就是pycharm的进程,我们做个试验:
输出进程pid 这里可以看出我们当前进程pid是5604,父进程的pid是6096,那么这个进程是谁呢?打开cmd输入:
cmd输出返回 试验了上面这个小实验,我们应该能明白,程序进程是从何而来,是父进程创建,父进程是哪里来,很明显是爷爷进程创建的...当然我们不需要研究太深,只需要明白,父进程和子进程的关系,一个父进程理论上可以创建n个子进程,前提是计算机支持。
如何创建一个进程
创建进程 以上的程序,采用了multiprocessing中Process方法创建了一个子进程,这个Process需要传递一个运行的函数,如果函数需要参数,可以采用args或者kwargs传递,同时也可以给这个子进程命名,只需要name='名称';言归正传,以上的程序,
Process用法 输出打印:
进程回显 join()阻塞进程
上面不难看出,第一步主进程运行,打印输出主进程的pid,接着主线程输出创建子进程的信息,然后主进程创建子线程,主进程启动子进程,主进程输出工作结束,最后子进程结束。整个流程就是这样的。在最后不难看出,主进程运行结束后,子进程没有被销毁,依然运行直至结束... 当然如果环境需要,子进程是为了配合主进程,这里就需要在子进程运行结束后,主进程才能退出,那这边就应该使用join的方法,
join用法 join()的功能就是阻塞,当子进程运行时,pro_1.start()启动子进程,pro_1.join()阻塞,确保子进程运行结束才能运行其他进程
案列一(多进程爬虫)
基础配置 返回值解析方法 数据请求调用解析 主逻辑运行 在这个小案列中,我没有用join()阻塞的方法,通过for循环创建多个进程,每个进程while Ture运行,在检索到一定情况下,break中断,然后进程会自动销毁