python 进程

2019-08-27  本文已影响0人  足__迹
  1. 就绪状态: 运行条件已经满足,正在等待cpu执行
  2. 执行状态: cpu正在执行
    3.等待状态: 等待某些条件满足,例如IO操作


    进程状态转化.png

线程和进程对比

功能

定义不同

区别

优缺点:

线程执行开销小,但不利于资源管理和保护,进程正好相反

举例:

from multiprocessing import Process #导入进程模块
from time import sleep

def work1():
    for i in range(6):
        print(F'{i}正在浇花')
        sleep(0.5)

def work2():
    for i in range(6):
        print(F'{i}正在打水')
        sleep(0.5)

if __name__ == '__main__':
    p1 = Process(target=work1)  #创建进程任务
    p2 = Process(target=work2)
    p1.start() #启动进程任务
    p2.start() #启动进程任务
    p1.join() #等待子进程运行完成
    p2.join()
    print('___________结束————————————————————————')
from multiprocessing import Process
import time


class MyProcess(Process):

    def run(self):  #执行的方法
        with open('test.txt',mode='a',encoding='utf-8')  as f:
            for i  in range(2):
                 f.write('python')
                 time.sleep(0.5)

class MyProcess2(Process):

    def run(self): #执行的方法
        with open('test.txt',mode='a',encoding='utf-8')  as f:
            for i  in range(2):
                 f.write('java {}')
                 time.sleep(0.5)


if __name__ == '__main__':
    c1 = MyProcess(name='111')
    c2 = MyProcess2()
    c1.start()
    print(c1.name)
    c2.start()

multiprocessing

grou    : 指定进程组一般用不到
target  : 指定任务,用zi进程执行这里的代码
name  : 给进程指定name
args    :    指定任务函数传递的参数,以元组的形式
kwargs : 给指定的函数传入命名参数
  1. start() : 启动子进程
  2. is_alive : 判断子进程是否活着
  3. join(timeout) : 等待子进程执行技术,timeout等待时间
  4. terminate(): 不管任务是否完成,立即终止程序
  1. name : 当前进程的别名 ,默认从Process-N ,N从1开始递增
  2. pid :当前进程的PID
   from multiprocessing import Process, Lock                                                     
import time, os                                                                               
                                                                                              
                                                                                              
class MyProcess(Process):                                                                     
    def __init__(self, meto):                                                                 
        super().__init__()                                                                    
        self.meto = meto                                                                      
                                                                                              
    def run(self):  # 执行的方法                                                                   
        meto.acquire()  # 上锁                                                                  
        with open('test.txt', mode='a', encoding='utf-8')  as f:                              
            for i in range(5):                                                                
                # 获取进程id的两种方式一种self.pid 一种os.pid                                              
                print('进程{}正在写入'.format(os.getpid()))                                         
                print('进程{}正在写入'.format(self.pid))                                            
                f.write('python/t')                                                           
                time.sleep(1)                                                                 
        meto.release()  # 解锁                                                                  
                                                                                              
                                                                                              
class MyProcess2(Process):                                                                    
    def __init__(self, meto):                                                                 
        super().__init__()                                                                    
        self.meto = meto                                                                      
                                                                                              
    def run(self):  # 执行的方法                                                                   
        meto.acquire()  # 上锁                                                                  
        with open('test.txt', mode='a', encoding='utf-8')  as f:                              
            for i in range(5):                                                                
                print('进程{}正在写入'.format(self.pid))  # 获取进程id的两种方式一种self.pid 一种os.pid          
                f.write('java\n')                                                             
                time.sleep(1)                                                                 
        meto.release()  # 解锁                                                                  
                                                                                              
                                                                                              
meto = Lock() #多进程公用外部资源需要加锁                                                                  
                                                                                              
                                                                                              
def main():                                                                                   
    c1 = MyProcess(meto)                                                                      
    c2 = MyProcess2(meto)                                                                     
    c1.start()                                                                                
    c2.start()                                                                                
    c1.join()                                                                                 
    c2.join()                                                                                 
    # c1.terminate()  # 不管是否执行完成直接停止                                                          
                                                                                              
                                                                                              
                                                                                              
if __name__ == '__main__':                                                                    
    main()                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

进程间的通讯

错误举例

#queue只能在同一个进程中各个线程之间的通讯

"""
1,进程间的通讯

"""
#用法1
from multiprocessing import Process,Lock #导入进程模块
from queue import Queue
import os
qc = Queue()
for i in range(5):
    qc.put(i)
def work3():
    for i  in range(5):
        print('进程{}获取值{}'.format(os.getpid(),qc.get()))

def work4():
    for i  in range(5):
        print('进程{}获取值{}'.format(os.getpid(), qc.get()))


meto = Lock()
#用法1
if __name__ == '__main__':

    p1 = Process(target=work3)  #创建进程任务
    p2 = Process(target=work4)
    p1.start() #启动进程任务
    p2.start() #启动进程任务
    p1.join() #等待子进程运行完成
    p2.join()
    print('___________结束————————————————————————')


输出值

两个进程各自获取一份数据


错误.png

正确的举例

# 进程模块中的queue,可用于多个进程之间的通讯

"""
1,进程间的通讯

"""
#用法1
from multiprocessing import Process,Lock,Queue #导入进程模块
# from queue import Queue
import os,time
qc = Queue()
for i in range(5):
    qc.put(i)

def work3(qc):
    while not qc.empty(): #判断队列中的参数是否为空
        print('进程{}获取值{}'.format(os.getpid(),qc.get()))
        time.sleep(1)

def work4(qc):
    while  not qc.empty():
        print('进程{}获取值{}'.format(os.getpid(), qc.get()))


meto = Lock()
#用法1
if __name__ == '__main__':

    p1 = Process(target=work3,args=(qc,))  #创建进程任务并将进程间传递的参数传入
    p2 = Process(target=work4,args=(qc,))  #创建进程任务并将进程间传递的参数传入
    p1.start() #启动进程任务
    p2.start() #启动进程任务
    p1.join() #等待子进程运行完成
    p2.join()
    print('___________结束————————————————————————')

结果

多个进程公用一份数据


正确.png
上一篇下一篇

猜你喜欢

热点阅读