python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进程。
Python提供了multiprocessing。 multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,>提供了Process、Queue、Pipe、Lock等组件。
需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。
创建并开启子进程的方式一
Process 传字典 或者args 传参数也可以
start()开启子进程
from multiprocessing import Processimport timedef task(name): print("%s is running" % name) time.sleep(3) print("%s is done" % name)if __name__ == "__main__": # 实例化 # args 为函数传参数 t = Process(target=task, args=("子进程1",)) # 开启子进程 t.start() # 仅仅只是给操作系统发送一个信号 与平常print没有什么区别 print("主")'''主子进程1 is running子进程1 is done''''''看得出是先打印主 再开启子进程1的'''
用关键字参数kwargs传参
from multiprocessing import Processimport timedef task(name): print("%s is running" % name) time.sleep(3) print("%s is done" % name)if __name__ == "__main__": # 实例化 # 也可以用kwargs 为函数传参数 以字典方式 t = Process(target=task, kwargs={'name': '子进程1'}) t.start()'''子进程1 is running子进程1 is done'''
应用程序是开不了子进程的 p.start() 给操作系统发送信号 至于操作系统什么时候开进程,开多长时间应用程序是控制不了。
p.start() 给操作系统发送信号 告诉操作系统给个开个子进程吧 操作系统收到后 申请内存空间 把父进程的地址空间数据 拷贝给子进程
作为子进程的初始状态
父进程不知道操作系统会
默认是先 开启主进程执行,主进程执行完,再开启 子进程执行,再到子进程执行结束。
创建并开启子进程的方式二
自己写一个子类去继承他 不用默认的类
方法一定要写run
from multiprocessing import Processimport time# 自己写一个子类去继承他 不用默认的类# Process的类传进去class MyProcess(Process): # 重写了init方法 父类就被覆盖掉 def __init__(self, name): # 重用父类 因为父类还有很多有用功能,继承父类 super().__init__() self.name = name # 方法一定要写run def run(self): print("%s is running" % self.name) time.sleep(3) print("%s is done" % self.name)if __name__ == "__main__": # 实例化 直接用自己自定义的类开子进程 # args 为函数传参数 p = MyProcess("子进程1") # 开启子进程 p.start() # 仅仅只是给操作系统发送一个信号 与平常print没有什么区别 # p.start() 本质是调用run方法 print("主")
来源:http://www.icode9.com/content-3-250451.html
联系客服