1.两种方式:
1.1 鼠标双击软件图标
1.2 python代码
2.用python代码创建进程(方法一):
"""
不同的操作系统盘创建进程的底层原理不一样
windows:以导入模块的形式创建进程
linux:以拷贝代码的形式创建进程
"""
windows如果用代码创建进程,进程文件相当于导模块,会将原来的代码原封不动地拷贝一份到新进程,新进程执行到创建进程那一步会继续创建新进程,往复循环,直到报错。而苹果电脑创建的新进程会不包含创建新进程的那一步,所以苹果电脑创建新进程不会循环报错。windows代码及报错信息如下:
from multiprocessing import Process
import time
deftask(name):
print('task is running', name)
time.sleep(3)
print('task is over', name)
p1 = Process(target=task)
p1.start()
print('主进程')
"""
windows创建新进程是以导模块的形式创建,所以导模块的几步应该要加上验证是否是执行文件的:if __name__ == '__main__'。
"""from multiprocessing import Process
import time
deftask(name):
print('task is running', name)
time.sleep(3)
print('task is over', name)
if __name__ == '__main__':
p1 = Process(target=task,args=(111,)) # 创建一个子进程对象
p1.start() # 用子进程对象创建一个新的进程,并在该进程中执行task功能print('主进程') # 执行结果:主进程 task is running 111 task is over 111
说明p1.start()生成一个新进程是一个异步操作,子进程中调用task函数,因为子进程拷贝代码需要时间,所以父进程中的print('主进程')会优先打印,打印结束之后会再执行子进程。
from multiprocessing import Process
import time
deftask(name):
print('task is running', name)
time.sleep(3)
print('task is over', name)
deffunc1():
print('from func1')
if __name__ == '__main__':
p1 = Process(target=task,args=(111,))
p2 = Process(target=func1)
p1.start()
p2.start()
print('主进程')
# 执行结果:主进程 task is running 111 from func1 task is over 111
一个父进程可以同时开多个子进程,子进程P1在读取的过程中先执行print('主进程'),再执行子进程p1中的print('task is running', name),此时子进程p1中还有部分代码未执行,由于要sleep3秒,此时先执行p2中的print('from func1'),最后执行print('task is over', name)。
3.用python代码创建进程(方法二):
from multiprocessing import Process
import time
classMyProcess(Process):
def__init__(self, name, age):
super().__init__()
self.name = name
self.age = age
defrun(self):
print('run is running', self.name, self.age)
time.sleep(3)
print('run is over', self.name, self.age)
if __name__ == '__main__':
obj = MyProcess('max', 25)
obj.start()
print('主进程')
# 主进程 run is running max 25 run is over max 25
该方法是利用类产生对象,然后用对象产生子进程的过程。还是先执行父进程中的print('主进程'),再执行子进程中的run is running max25、run is over max25。
5.进程的join方法、数据隔离
'''同一台计算机上的多个进程数据是严格意义上的物理隔离(默认情况下)'''
money = 1000deftask():
money = 666if __name__ == '__main__':
task()
print(money)
# 1000 print(money)找的是全局名称空间中的money
money = 1000deftask():
global money
money = 666if __name__ == '__main__':
task()
print(money)
# 666 global局部修改全局,主进程全局名称空间中的money被改成666from multiprocessing import Process
import time
money = 1000deftask():
global money
money = 666print('子进程中的money', money) # 子进程中的money 666 if __name__ == '__main__':
p1 = Process(target=task)
p1.start()
time.sleep(3)
print(money)
# 1000"""
如果没有if __name__ == '__main__':及子代码,此时全局名称空间中的money已经被修改成666,局部名称空间中无money。但是要生成一个子进程,在子进程中调用task()函数,子进程中会调用全局名称空间中的money以及task()函数,task()函数执行修改的是子进程中全局名称空间中的money。task()函数体代码中查看的是子进程中的money,结果是666,说明已经修改。
"""
需求:如何实现子进程运行结束之后再运行主进程?
from multiprocessing import Process
import time
deftask(name):
print('%s is running' % name)
time.sleep(3)
print('%s is over' % name)
if __name__ == '__main__':
p = Process(target=task, args=('max',))
p.start()
print('主进程')
# 主进程 max is running max is over"""
正常运行会先执行父进程的所有代码(父进程中有IO操作的除外),再执行子代码,因为在子代码读取过程中CPU会先读取父代码并且执行
"""from multiprocessing import Process
import time
deftask(name):
print('%s is running' % name)
time.sleep(3)
print('%s is over' % name)
if __name__ == '__main__':
p = Process(target=task, args=('max',))
p.start()
time.sleep(4)
print('主进程')
# max is running max is over 主进程 """
上述代码实现了先执行子进程再执行父进程,依靠的是父进程休眠时间总是比子进程长一些。但这种方法的弊端在于我们不知道子进程什么时候会休眠几秒,使用这种方式存在很多不确定性
"""from multiprocessing import Process
import time
deftask(name):
print('%s is running' % name)
time.sleep(3)
print('%s is over' % name)
if __name__ == '__main__':
p = Process(target=task, args=('max',))
p.start()
p.join()
print('主进程')
# max is running max is over 主进程"""
join()方法不管子进程需要休眠多少秒,直到执行完行子进程,再执行父进程
"""from multiprocessing import Process
import time
deftask(name, n):
print('%s is running' % name)
time.sleep(n)
print('%s is over' % name)
if __name__ == '__main__':
p1 = Process(target=task, args=('max1',1))
p2 = Process(target=task, args=('max2',2))
p3 = Process(target=task, args=('max3', 3))
start_time = time.time()
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
print(time.time() - start_time)
"""
max1 is running
max2 is running
max3 is running
max1 is over
max2 is over
max3 is over
3.151333808898926
""""""
根据前六部打印顺序得知,第一个子进程先开始,不等睡眠结束就开始运行第二个,再第三个。start()连在一起说明无需等待上一个子进程结束就可以开始下一个。
"""from multiprocessing import Process
import time
deftask(name, n):
print('%s is running' % name)
time.sleep(n)
print('%s is over' % name)
if __name__ == '__main__':
p1 = Process(target=task, args=('max1',1))
p2 = Process(target=task, args=('max2',2))
p3 = Process(target=task, args=('max3', 3))
start_time = time.time()
p1.start()
p1.join()
p2.start()
p2.join()
p3.start()
p3.join()
print(time.time() - start_time)
"""
max1 is running
max1 is over
max2 is running
max2 is over
max3 is running
max3 is over
6.363624334335327
""""""
join()表示必须等子进程运行结束之后才能运行主进程,同时也表示上一个子进程结束之后才能运行下一个。
"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律