进程(笔记) python

进程

调用multiprocess模块 :该模块本质上并不是一个模块 而是一个关于进程管理的和操作的包

 

# process模块: 创建进程
import time
from multiprocessing import Process

 

# 子进程任务
def sub_process():
while 1:
print("-----subprocess------")
time.sleep(1)

if __name__=='__main__':
sbp = Process(target=sub_process, args=(a, ), kwargs={'name': '李先锋'})
sbp.start()
while 1:
print('----mainprocess-----')
time.sleep(1)

整个py文件右键run就会创建一个进程,这个进程称为主进程

在程序中创建了一个进程sbp,sbp就是主进程的子进程

创建子进程时使用Process,秩序传入子进程要执行的函数和函数的参数集合,利用进程对象的start()方法来启动进程

在调用Process时,需要使用关键字的方式来指定参数

Process

target:如果传递了函数的引用可以认为这个子进程就是执行这里的代码

args:给target指定的函数传递参数,已元组的方式传递,如果元组只有一个元素,需要在元素末尾添加,

kwargs:给target指定的函数传递命名参数

name:给进程设定一个名字,可以不设定

group:指定进程组,大多数情况下用不到

process创建的实例对象常用方法

start():启动子进程(创建子进程)

is_alive():判断子进程是否还运行或者等候

join([timeout]):是否等待子进程执行结束,或等待多少秒

terminate():不管任务是否完毕,立即终止子进程

process创建的实例对象常用属性

name:当前进程的别名,默认为‘Process-N’,N为从1开始递增的整数

pid:当前进程的‘pid’(进程号)

# -*- coding:utf-8 -*-
# 复杂一点的进程: 创建进程, 传递参数, 查看进程的进程id, 结束子线程, join等待
from multiprocessing import Process
import os
from time import sleep


def run_proc(name, age, **kwargs):
for i in range(10):
print('子进程运行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid()))
print(kwargs)
sleep(0.2)

if __name__=='__main__':
p = Process(target=run_proc, args=('test',18), kwargs={"m":20})
p.start()
sleep(1) # 1秒中之后,立即结束子进程
print('我是主线程!!!')
p.terminate()
p.join()

进程之间无法共享公共变量数据

在进程之间通信可以使用‘multiprocessing’模块的‘Queue’实现多进程之间的数据传递    ‘Queue’本身就是一个消息队列程序

# 进程间通信
from multiprocessing import Process, Queue
import os, time, random


# 写数据进程执行的代码:
def write(q):
for value in ['A', 'B', 'C']:
print('Put %s to queue...' % value)
q.put(value)
time.sleep(random.random())

# 读数据进程执行的代码:
def read(q):
while True:
if not q.empty():
value = q.get(True)
print('Get %s from queue.' % value)
time.sleep(random.random())
else:
break

if __name__=='__main__':
# 父进程创建Queue,并传给各个子进程:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
# 启动子进程pw,写入:
pw.start()
# 等待pw结束:
pw.join()
# 启动子进程pr,读取:
pr.start()
pr.join()
# pr进程里是死循环,无法等待其结束,只能强行终止:
print('')
print('所有数据都写入并且读完')

进程池  即进程待处理器处理的等待区 

定义一个池子在里面放上固定数量的进程  有需求就拿一个进程来处理任务,处理完毕后将进程返还进程池内继续等待  

也就是说池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省开闭进程的时间,也就一定程度上能够实现并发效果

 

posted @ 2020-12-22 18:39  罗万  阅读(75)  评论(0)    收藏  举报