目录
一、开启进程
windows操作系统中 创建进程的语句一定要放在"if __name__ == '__main__':"条件语句下面
import os
from multiprocessing import Process
def func():
print('子进程',os.getpid())
print('主进程',os.getppid())
print(123)
# 如果主进程中的代码已经结束了,子进程还没结束,主进程会等待子进程
if __name__ == '__main__':
p = Process(target=func) # 创建一个进程对象
print('主进程',os.getpid())
p.start() # 执行了start才有进程
print('主进程',os.getpid())
import time
from multiprocessing import Process
def func(money):
time.sleep(3)
print("取钱:%d" % money)
# p.join 就是主进程会阻塞在join的位置,等待p进程结束
if __name__ == '__main__':
p = Process(target=func, args=(1,))
p.start()
print('去取钱')
p.join() # 阻塞
print('取完钱了')
二、开启多个子进程
1.实例化多个Process类
#开启多个子进程
from multiprocessing import Process
import os
def func():
print('子进程%d干的事,父进程:%d' % (os.getpid(), os.getppid()))
if __name__ == '__main__':
p = Process(target=func)
p1 = Process(target=func)
p2 = Process(target=func)
p.start()
p1.start()
p2.start()
p.join()
print('-------主进程------')
2.循环
from multiprocessing import Process
import os
import time
def func(i):
time.sleep(1)
print('%d:子进程%d干的事,父进程:%d' % (i, os.getpid(), os.getppid()))
# 这个字符串'-----主进程-----'只是在序号为九的进程之后打印
if __name__ == '__main__':
for i in range(10):
p = Process(target=func, args=(i,))
p.start()
p.join()
print('-----主进程-----')
from multiprocessing import Process
import os
import time
def func(i):
time.sleep(1)
print('%d:子进程%d干的事,父进程:%d' % (i, os.getpid(), os.getppid()))
# 这个字符串'-----主进程-----'一定是在所有进程之后打印,且进程的启动是按顺序的
if __name__ == '__main__':
for i in range(10):
p = Process(target=func, args=(i,))
p.start()
p.join()
print('-----主进程-----')
from multiprocessing import Process
import os
import time
def func(i):
time.sleep(1)
print('%d:子进程%d干的事,父进程:%d' % (i, os.getpid(), os.getppid()))
if __name__ == '__main__':
p_lst= []
for i in range(10):
p = Process(target=func, args=(i,))
p.start()
p_lst.append(p)
for p in p_lst:
p.join()
print('-----主进程-----')
三、通过类开启一个进程
通过类开启一个进程:
必须创建一个类,必须继承Process类
必须实现一个run方法
实例化Myprocess得到一个对象
使用对象调用start方法
1.开启一个进程
import os
from multiprocessing import Process
class MyProcess(Process):
def run(self):
print('子进程:%d' % os.getpid())
if __name__ == '__main__':
p = MyProcess()
p.start()
print('主进程:%d' % os.getpid())
2. 开启一个进程(传参)
# 通过类开启一个进程(传参)
import os
from multiprocessing import Process
class MyProcess(Process):
def __init__(self, arg1, arg2, arg3):
super().__init__()
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def run(self):
print('子进程:', os.getpid(), self.arg1, self.arg2, self.arg3)
if __name__ == '__main__':
p = MyProcess(1,2,3)
p.start() # 会默认调用run方法
print('主进程:%d' % os.getpid())
# 通过类开启一个进程(传参)
import os
from multiprocessing import Process
class MyProcess(Process):
def __init__(self, arg1, arg2, arg3):
super().__init__()
self.arg1 = arg1
self.arg2 = arg2
self.arg3 = arg3
def run(self):
print('(run方法)子进程:', os.getpid(), self.arg1, self.arg2, self.arg3)
self.walk() # 子进程调用
def walk(self):
print('(walk方法)进程:%d' % os.getpid())
if __name__ == '__main__':
p = MyProcess(1,2,3)
p.start() # 会默认调用run方法
p.walk() # 主进程调用
print('主进程:%d' % os.getpid())
四、数据隔离
# 进程与进程之间数据是隔离的
from multiprocessing import Process
n = 100
def func():
global n
n= n - 1
print('子进程:',n) # 99
if __name__ == '__main__':
print('主进程:', n) # 100
p = Process(target=func)
p.start()
p.join()
print('主进程:', n) # 100