关于进程

#进程
1.###子进程的创建
####关于子进程:1):父进程和子进程, 如果父进程结束, 子进程也随之结束;2):先有父进程, 再有子进程, 通过fork函数实现;3)关于fork函数:调用该方法一次, 返回两次;4):产生的子进程返回一个0,父进程返回子进程的pid;5):os.getpid(): 获取当前进程的pid;os.getppid(): parent process id, 获取当前进程的父进程的id号;

import  multiprocessing
import  os
import  time
print("当前进程(pid=%d)正在运行..." %(os.getpid()))
print("当前进程的父进程(pid=%d)正在运行..." %(os.getppid()))
print("正在创建子进程......")
pid = os.fork()
pid2 = os.fork()
print("第1个:", pid)
print("第2个: ", pid2)
if pid == 0:
    print("这是创建的子进程, 子进程的id为%s, 父进程的id为%s"
          %(os.getpid(), os.getppid()))
else:
    print("当前是父进程[%s]的返回值%s" %(os.getpid(), pid))
time.sleep(10)
当前进程(pid=3811)正在运行...
当前进程的父进程(pid=3622)正在运行...
正在创建子进程......
第1个: 3812
第2个:  3813
当前是父进程[3811]的返回值3812
第1个: 0
第2个:  3814
这是创建的子进程, 子进程的id为3812, 父进程的id为3811
第1个: 0
第2个:  0
这是创建的子进程, 子进程的id为3814, 父进程的id为3812
第1个: 3812
第2个:  0
当前是父进程[3813]的返回值3812

2.###通过实例化对象创建多进程

import  multiprocessing
import  threading
def job():
    print("当前子进程的名称为%s" %(multiprocessing.current_process()))
# 创建一个进程对象
p1 = multiprocessing.Process(target=job)
# 运行多进程, 执行任务
p1.start()
# 创建一个进程对象
p2 = multiprocessing.Process(target=job)
# 运行多进程, 执行任务
p2.start()
# 等待所有的子进程执行结束, 再执行主进程的内容
p1.join()
p2.join()
print("任务执行结束.......")
当前子进程的名称为<Process(Process-1, started)>当前子进程的名称为<Process(Process-2, started)>
任务执行结束.......

3.###通过继承的方式创建子进程

import  multiprocessing
class JobProcess(multiprocessing.Process):
    # 重写Process的构造方法, 获取新的属性
    def __init__(self, queue):
        super(JobProcess, self).__init__()
        self.queue = queue
    # 重写run方法, 将执行的任务放在里面即可
    def run(self):
        print("当前子进程的名称为%s" % (multiprocessing.current_process()))
processes = []
# 启动10个子进程, 来处理需要执行的任务;
for i in range(10):
    # 实例化对象;
    p = JobProcess(queue=3)
    processes.append(p)
    # 启动多进程, 处理需要执行的任务;
    p.start()
# 等待所有的子进程执行结束, 再继续执行主进程
[process.join() for process in processes]
# 执行主进程
print("任务执行结束.......")
当前子进程的名称为<JobProcess(JobProcess-1, started)>
当前子进程的名称为<JobProcess(JobProcess-3, started)>
当前子进程的名称为<JobProcess(JobProcess-4, started)>
当前子进程的名称为<JobProcess(JobProcess-5, started)>
当前子进程的名称为<JobProcess(JobProcess-6, started)>
当前子进程的名称为<JobProcess(JobProcess-8, started)>
当前子进程的名称为<JobProcess(JobProcess-9, started)>
当前子进程的名称为<JobProcess(JobProcess-7, started)>
当前子进程的名称为<JobProcess(JobProcess-10, started)>
当前子进程的名称为<JobProcess(JobProcess-2, started)>
任务执行结束.......

4.###守护进程:
####守护线程:setDeamon:True: 主线程执行结束, 子线程不再继续执行;
####守护进程:setDeamon: True: 主进程执行结束, 子进程不再继续执行;

import  multiprocessing
import time
def job():
    name = multiprocessing.current_process()
    print("开始运行")
    time.sleep(3)
    print("结束进程")
if __name__ == '__main__':
    # 启动一个子进程
    p1 = multiprocessing.Process(target=job, name='use deamon')
    # True/False
    p1.daemon = False
    p1.start()
    # join等待所有子进程执行结束, 再执行主进程
    p1.join(1)
    # 主进程执行
    print("程序执行结束")
开始运行
程序执行结束
结束进程

5.###终止进程

import time
import  multiprocessing
def job():
    print("start.....")
    time.sleep(1)
    print('end.......')
if __name__ == '__main__':
    p = multiprocessing.Process(target=job)
    print("Before:", p.is_alive())
    p.start()  # 启动子进程
    print("During:", p.is_alive())
    p.terminate()   # 终止子进程
    print('terminate:', p.is_alive())
    p.join()        #等待子进程彻底终止
    print("joined:", p.is_alive())
Before: False
During: True
terminate: True
joined: False

6.###进程池:如果启动大量的子进程,会消耗时间用来创建和销毁子进程,使用进程池,不需要启动大量的进程

import  multiprocessing
import time
def job(id):
    print('start %d.....' %(id))
    print('end %d.....' %(id))
# 创建一个进程池对象
pool = multiprocessing.Pool(10)
# 给进程池的进程分配任务
for i in range(10):
    pool.apply_async(job,args=(i, ) )
pool.close()
# 等待所有的子进程执行结束
pool.join()
print('success')
start 0.....
end 0.....
start 1.....
end 1.....
start 2.....
end 2.....
start 3.....
end 3.....
start 4.....
end 4.....
start 5.....
end 5.....
start 6.....
end 6.....
start 7.....
end 7.....
start 8.....
end 8.....
start 9.....
end 9.....
success

7.###进程池与map

from concurrent.futures import  ThreadPoolExecutor
from concurrent.futures import  ProcessPoolExecutor
def job(id):
    print('start %d.....' %(id))
    print('end %d.....' %(id))
    return  id
pool = ProcessPoolExecutor(max_workers=4)
for res in pool.map(job, range(1,4)):
    print(res)
start 1.....
end 1.....
start 2.....
end 2.....
start 3.....
end 3.....
1
2
3

8.###分布式进程:任务需要处理的数据特别大, 希望多台主机共同处理任务
###分布式进程的实现方式: multiprocessing.managers子模块里面可以实现将进程分布到多台机器上;

import random
from multiprocessing.managers import BaseManager
from queue import Queue
task_queue=Queue()
result_queue=Queue()
BaseManager.register('get_task_queue',callable=lambda :task_queue)
BaseManager.register('get_result_queue',callable=lambda :result_queue)
manager=BaseManager(address=('172.25.254.88',4000),authkey=b'westos')
manager.start()
task=manager.get_task_queue()
result=manager.get_result_queue()
for i in range(100):
    n=random.randint(1,1000)
    task.put(n)
    print("任务列表加入任务:%d"%(n))
for j in range(100):
    res=result.get()
    print("队列任务的执行结果:%s"%(res))
manager.shutdown()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值