多进程
1. 进程
现在未开辟子进程,print函数和func函数在同一个进程里
当程序运行起来操作系统会创建一个进程来供程序任务实现,这个进程我们称为主进程
进程1 .py
from multiprocessing import Process
from time import sleep
import os
def func(string):
print('hello')
if __name__ == '__main__':
func('123')
print('main')
会同时输出
hello
main
如果此时修改一下,给func函数一个死循环,可以发现main永远不会打印,输出的都是hello,因为func函数会阻塞主进程
进程2 .py
from multiprocessing import Process
from time import sleep
import os
def func(string):
while True:
print('hello')
if __name__ == '__main__':
func('123')
print('main')
如果这样难以理解,修改一下代码,可以运行一下这个程序,观察变化
进程2 .py
from multiprocessing import Process
from time import sleep
import os
def func(string):
while True:
print('hello')
sleep(2)
if __name__ == '__main__':
func('123')
while True:
print('我是主进程')
sleep(2)
可以发现,执行的都是func函数,每隔2秒打印hello,而我是主进程这几个字永远不会打印,因为func函数在阻塞主进程
2. 创建子进程
创建一个子进程,把func函数绑定到子进程中
多进程1 .py
from multiprocessing import Process
from time import sleep
import os
def func(string):
while True:
print(string)
sleep(1)
# 当程序运行起来操作系统会创建一个进程来供程序任务实现,这个进程我们称为主进程
if __name__ == '__main__':
# 创建一个子进程,把func函数绑定到子进程中
p = Process(target=func,args=("我是子进程!",)) # 在主进程中创建了一个子进程
print(p)
#打印一下子进程 得到的是 <Process(Process-1, initial)>
while True:
print("我是主进程!")
sleep(1)
运行一下这个程序,发现打印的都是 **我是主进程!**这句话,为什么呢?因为这时候还没开启子进程
现在,开启子进程
显示一下进程id更便于理解
from multiprocessing import Process
from time import sleep
import os
def func(string):
while True:
print(string)
print("我的id为:",os.getpid())
sleep(2)
# 当程序运行起来操作系统会创建一个进程来供程序任务实现,这个进程我们称为主进程
if __name__ == '__main__':
# 创建一个子进程,把func函数绑定到子进程中
p = Process(target=func,args=("我是子进程!",)) # 在主进程中创建了一个子进程
print(p) # <Process(Process-1, initial)>
# 开启上面创建的子进程
p.start()
while True:
print("我是主进程!")
print("我的进程id为:",os.getpid())
sleep(2)
运行一下这个程序,可以发现,
每隔2秒打印一次下方内容
我是主进程!
我的进程id为: 2448
我是子进程!
我的id为: 19640
我们宏观上(从肉眼上看)同时打印主进程和子进程,而实际上
是并发执行