多进程最全讲解———你不进来看看嘛?

进程

进程(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。

特点

  1. 只有子进程都结束了主进程才会结束
  2. 不共享全局变量
创建单进程
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)

解释:通过编号来结束子程序不在让他运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值