python3进程实操学习备忘

#!/usr/bin/env python3
#coding:utf-8
'''
进程:
1.python因为gil锁的原因,实际上多线程是没法实现真正意义的并发的。多进程解决了此问题
2.问题:多进程,进程之前沟通或存取同一数据是一个问题。需要第3方工具协助!
3.创建多进程时,实际上是复制了一份数据!
4.父进程和子进程之间通讯可通过Queue(进程里的队列,与线程的队列不同)、Pipe(管道)、Manager()三种方式解决
5.if __name__ == "__main__": 创建多进程的时候,此句必须增加,要不容易造成僵局进程
6.IDE为主进程的父进程,主进程是子进程的父进程
'''
#************Manager(进程专用)实现进程间数据互传*************
from multiprocessing import Process,Manager
import time

def f(dct,lst,i):
    dct[i] = "zuly"
    lst[i] = 3
    dct["aaa"] = "b"

if __name__ == "__main__":
   with Manager() as manager:   # 用with创建manager实例(不需要close()关闭)
       dct = manager.dict()     # 创建一个manager的字典,用来与子进程进行沟通
       lst = manager.list(range(2))     # 创建一个manager的列表,用来与子进程进行沟通
       p_lst = []
       for i in range(2):
           p = Process(target = f, args = (dct, lst, i))    # 创建子进程,同时把manager字典及manager列表传送给到子进程处理
           p.start()
           p_lst.append(p)
       for i in p_lst:
           i.join()
       for i in dct:
           print("dct[%s]=%s"%(i,dct[i]))   # 获得子进程处理完后传送回来的manager字典
       for i in range(len(lst)):
           print("lst[%s]=%s"%(i,lst[i]))   # 获得子进程处理完后传送回来的manager列表
       print("end")


'''
#************Pipe(进程专用)实现进程间数据互传*************
from multiprocessing import Process,Pipe
import time
def f(conn):
    a = "zuly"
    conn.send("this is aaa...")     # 子进程发送数据给到主进程
    conn.send(a)
    print(conn.recv())      # 子进程接收主进程传来的数据
    conn.close()    # 关闭管理的子连接

if __name__ == "__main__":
    parent_conn,child_conn = Pipe()     # 创建管道实例,获得主进程连接、子进程连接
    p_list = []
    for i in range(2):
        parent_conn.send("aaaa")    # 主进程发送数据给到子进程
        p = Process(target = f, args = (child_conn,))   # 把管道的子连接传送给到子进程使用
        p.start()
        p_list.append(p)
    for i in p_list:
        i.join()
    for i in range(2):
        print(parent_conn.recv())   # 主进程接收子进程传来的数据。一收一发
        print(parent_conn.recv())
    print("end")
'''

'''
#************Queue(进程专用)实现进程间数据互传*************
from multiprocessing import Process,Queue
def f(q,i):
    q.put(i)    # 子进程对队列进行操作

if __name__ == "__main__":
    q = Queue()     # 创建队列实例
    p_list = []
    for i in range(3):
        p = Process(target = f, args = (q,i))   # 把队列传给子进程执行
        p.start()
        p_list.append(p)
    for i in p_list:
        i.join()
    print(q.get())  # 主进程进行使用经过子进程处理过的队列
    print(q.get())
    print(q.get())
'''    

'''
#************类方式创建多进程的*************
from multiprocessing import Process
import time
import os

class MyProcess(Process):   # 创建一个多进程类(继续多进程模块Process)
    def __init__(self,name,i):  # 创建实例时,自动调用init方法(需要先调用执行父类Process的init方法),之后,再封装一定的数据到类里
        super(MyProcess,self).__init__()    
        self.name = name + str(i)
    
    def run(self):  # 必须是run方法,底下内容各进程要执行的共同代码
        time.sleep(1)
        print("%s逻辑代码都在此执行。相当于函数%s"%(self.name,time.ctime()))
        print("子进程的pid是:%s"%os.getpid())   
        print("子进程的父进程pid是:%s"%os.getppid())    
        
if __name__ == "__main__":  # 创建多进程的时候,此句必须增加,要不容易造成僵局进程
    p_list = []
    print("主进程的pid是:%s"%os.getpid())    # 获得进程id
    print("主进程的父进程pid是:%s"%os.getppid())    # 获得父进程id
    for i in range(5):
        p = MyProcess("zuly",i) # 创建多进程--实例化,并封装数据进实例里
        p.start()   # 启动进程
        p_list.append(p)
    for i in p_list:
        i.join()
    print("end")
'''

'''
#************普通方式创建多进程的*************
from multiprocessing import Process
import time

def f(name,i):
    time.sleep(1)
    print("name is %s,%s"%(name,str(i)))

if __name__ == "__main__":
    p_list = []
    for i in range(10):
        p = Process(target = f, args = ("zuly",i))      # 创建了10个进程(与线程差不多)
        p_list.append(p)
        p.start()
    for i in p_list:
        i.join()
    print("end")
'''


posted @ 2019-01-10 13:16  挖坑达人  阅读(6)  评论(0编辑  收藏  举报