由于CPython实现中的GIL的限制,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况我们需要使用多进程。 这也许就是python中多进程类库如此简洁好用的原因所在。在python中可以向多线程一样简单地使用多进程。
一、多进程
process的成员变量和方法:
>>class multiprocessing.Process([group[, target[, name[, args[, kwargs]]]]]) 来的定义类似于threading.Thread。target表示此进程运行的函数,args和kwargs表示target的参数。
>>name, pid
分别表示进程的名字,进程id。
>> daemon成员
daemon标志位bool变量,需要在start()调用前设置。daemon的初始值是从父进程继承而来。当一个进程结束的时候,它尝试去结束它的所有的daemon子进程。
注意:
daemon进程不允许创建子进程。否则当daemon进程结束的时候它的子进程不能被结束。
这里的daemon不是Unix的daemon进程,当父进程结束的时候所有的daemon子进程也将被终止(对于非daemon进程,父进程不等待非daemon的紫子进程,除非显示地对非daemon子进程使用join()方法)。
>> exitcode
如果进程还没有退出,则为None,如果正确的退出则为0,如果有错误则为>0的错误代码,如果进程为终止则为-1*singal。
>> start(), is_live(), terminate()
start()用来启动进程,is_live()用来查看进程的状态,terminate()用来终止进程。
>> run()
可以在process的子类中重载run()方法,从而设定进程的任务。重载process是构造新进程的另一种方式,一定程度上上等价于process的target参数。
multiprcessing的静态方法:
>> multiprocessing.cpu_count()
用来获得当前的CPU的核数,可以用来设置接下来子进程的个数。
>> multiprocessing.active_children()
用来获得当前所有的子进程,包括daemon和非daemon子进程。
实例:
import multiprocessing import time import sysdef worker(num): p = multiprocessing.current_process() print ('Starting:' + p.name + ":" + str(p.pid)) print(str(num)) sys.stdout.flush() print ('Exiting :' + p.name + ":" + str(p.pid)) sys.stdout.flush()
def daemon(): p = multiprocessing.current_process() print ('Starting:' + p.name + ":" + str(p.pid)) sys.stdout.flush() time.sleep(10) print ('Exiting :' + p.name + ":" + str(p.pid)) sys.stdout.flush() def non_daemon(): p = multiprocessing.current_process() print ('Starting:' + p.name + ":" + str(p.pid)) sys.stdout.flush() time.sleep(20) print ('Exiting :' + p.name + ":" + str(p.pid)) sys.stdout.flush() if __name__ == '__main__': w = multiprocessing.Process(name='worker', target=worker, args=(100,)) d = multiprocessing.Process(name='daemon', target=daemon) d.daemon = True nd = multiprocessing.Process(name='non-daemon', target=non_daemon) w.start() d.start() nd.start() print("the number of CPU is " + str(multiprocessing.cpu_count())) print("All children processes:") for p in multiprocessing.active_children(): print("child:" + p.name + ":" + str(p.pid)) print() w.join() #d.join()
运行结果:
可以从上面的例子看到没有多非daemon子进程使用join()方法,结果父进程没有等待非daemon进程结束就退出了。
前言 进程作为程序真正发挥作用时的“形态”,我们有必要对它的一些相关操作非常熟悉,这一节主要描述进程相关的概念和操作,将介绍包括程序、进程、作业等基本概念以及进程状态查询、进程通信等相关的操作。 什么是程序,什么又是进程 程序是指令的集合,而进程则是程序执行的基本单元。为了让程序完成它的工作,必须让程序运行起来成为进程,进而利用处理器资源、内存资源,进行各种 I/O 操作,从而完成某项特定工作。
本文向大家介绍python3爬虫中多线程进行解锁操作实例,包括了python3爬虫中多线程进行解锁操作实例的使用技巧和注意事项,需要的朋友参考一下 生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开。同样的之间我们讲过多线程中的lock,作用是为了不让多个线程运行是出错所以进行锁住的指令。但是鉴于我们实际运用中,因为线程和指令不会只有一个,如果全部都进行lo
本文向大家介绍Python Process多进程实现过程,包括了Python Process多进程实现过程的使用技巧和注意事项,需要的朋友参考一下 进程的概念 程序是没有运行的代码,静态的; 进程是运行起来的程序,进程是一个程序运行起来之后和资源的总称; 程序只有一个,但同一份程序可以有多个进程;例如,电脑上多开QQ; 程序和进程的区别在于有没有资源,进程有资源而程序没有资源,进程是一个资源分配的
本文向大家介绍Python多线程多进程实例对比解析,包括了Python多线程多进程实例对比解析的使用技巧和注意事项,需要的朋友参考一下 多线程适合于多io操作 多进程适合于耗cpu(计算)的操作 可以看到在耗cpu的应用中,多进程明显优于多线程 2.6130592823028564 < 3.905290126800537 下面模拟一个io操作 可以看到 8.00358772277832 < 8.1
本文向大家介绍Python多进程编程multiprocessing代码实例,包括了Python多进程编程multiprocessing代码实例的使用技巧和注意事项,需要的朋友参考一下 在 多线程与多进程的比较 这一篇中记录了多进程编程的一种方式. 下面记录一下多进程编程的别一种方式,即使用multiprocessing编程 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教
本文向大家介绍python操作gmail实例,包括了python操作gmail实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python操作gmail的方法。分享给大家供大家参考。 具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。