进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。我们自己在python文件中写了一些代码,这叫做程序,运行这个python文件的时候,这叫做进程。
- 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being
executed)。
- 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
首先导入包:import multiprocessing
创建进程的类:Process([group [, target [, name [, args [, kwargs]]]]]),
-
target:表示调用对象
-
args:表示调用对象的位置参数元组
-
kwargs:表示调用对象的字典
-
name:为别名
-
group:实质上不使用 默认为None
方法:join([timeout])、run()、start()、terminate()。其中,Process以start()启动某个进程。
属性:authkey、daemon(要通过start()设置)、exitcode(进程在运行时为None、如果为–N,表示被信号N结束)、name、pid。
特点:
- 只有子进程都结束了主进程才会结束
- 不共享全局变量
创建单进程
import multiprocessing
import time
def worker():
n = 5
while n > 0:
print("The time is {0}".format(time.ctime()))
#使程序休眠一秒
time.sleep(1)
n -= 1
#进入主进程
if __name__ == "__main__":
#创建一个子进程 使用target将worke方法放入子进程中
p = multiprocessing.Process(target = worker)
#开启子进程
p.start()
结果
The time is Sat Aug 8 13:13:40 2020
The time is Sat Aug 8 13:13:41 2020
The time is Sat Aug 8 13:13:42 2020
The time is Sat Aug 8 13:13:43 2020
The time is Sat Aug 8 13:13:44 2020
创建多进程(下载期间还能上传)
import multiprocessing
import time
def start():
print("1:下载软件")
print("2:上传文件")
while True:
xia_down = input()
if xia_down == "1":
ser1.start()
elif xia_down == "2":
ser2.start()
def down():
for i in range(101):
print(f"已下载{i}%")
time.sleep(1)
if i >= 100:
return
def upload():
for i in range(101):
print(f"已上传{i}%")
time.sleep(1)
if i >= 100:
return
ser1 = multiprocessing.Process(target=down)
ser2 = multiprocessing.Process(target=upload)
if __name__ == "__main__":
start()
daemon方法
import multiprocessing
import time
def worker1(interval):
print("work1 start:{0}".format(time.ctime()));
time.sleep(interval)
print("work1 end:{0}".format(time.ctime()));
def worker2(interval):
print("work2 start:{0}".format(time.ctime()));
time.sleep(interval)
print("work2 end:{0}".format(time.ctime()));
if __name__ == "__main__":
p = multiprocessing.Process(target = worker1, args = (3,))
b = multiprocessing.Process(target = worker2, args = (3,))
p.daemon = True
p.start()
b.start()
#结束主程序
exit()
解释:其中daemon是父进程终止后自动终止,且自己不能产生新进程,必须在start()之前设置。简单解释就是:主程序保护了子程序p,主程序结束了,子程序p也就不能执行了。只能执行子程序b。
join方法
import multiprocessing
import time
def worker1(interval):
print("work1 start:{0}".format(time.ctime()));
time.sleep(interval)
print("work1 end:{0}".format(time.ctime()));
def worker2(interval):
print("work2 start:{0}".format(time.ctime()));
time.sleep(interval)
print("work2 end:{0}".format(time.ctime()));
if __name__ == "__main__":
p = multiprocessing.Process(target = worker1, args = (3,))
b = multiprocessing.Process(target = worker2, args = (3,))
p.start()
p.join()
b.start()
解释:当这个子程序运行完,下一个程序才能执行
terminate方法
import multiprocessing
import time
def run():
print(time.time())
for i in range(5):
print("跑")
time.sleep(1)
def sun():
print(time.time())
for i in range(5):
print("走")
time.sleep(1)
p = multiprocessing.Process(target = run)
b = multiprocessing.Process(target = sun)
r.start()
r.terminate()
s.start()
解释:立马停止子程序,使下面的子程序运行
查看编码
查看子程序的编码(os.getpid())
import multiprocessing
import time
import os
def run():
print(time.time())
print(os.getpid())
for i in range(5):
print("跑")
time.sleep(1)
p = multiprocessing.Process(target = run)
r.start()
查看子程序父级的编码(os.getppid())
import multiprocessing
import time
import os
def run():
print(time.time())
print(os.getppid())
for i in range(5):
print("跑")
time.sleep(1)
def sun():
print(time.time())
for i in range(5):
print("走")
time.sleep(1)
p = multiprocessing.Process(target = run)
b = multiprocessing.Process(target = sun)
if __name__ == "__main__":
r.start()
s.start()
编号的作用:
import multiprocessing
import time
import os
def run():
print(time.time())
print(os.getppid())
for i in range(5):
print("跑")
if i==3:
os.kill(os.getppid(),9)
time.sleep(1)
解释:通过编号来结束子程序不在让他运行