进程详解

1.面向对象 __setitrm__  getitem__

 1 class Foo(object):
 2     def __init__(self):
 3         self.info={}
 4     def __setitem__(self, key, value):
 5         self.info[key]=value
 6     def __getitem__(self, item):#item为key
 7         print(item)
 8         return self.info[item]
 9 obj=Foo()
10 obj["c"]=233#这里只是单纯的作为字典
11 print(obj["c"])

2.面向对象__setattr__,__getattr__

 1 class Foo(object):
 2     def __init__(self):
 3         object.__setattr__(self,"info",{})#模块内部本质的方法
 4     def __setattr__(self, key, value):
 5         self.info[key]=value
 6     def __getattr__(self, item):#这里的item 差不多是key
 7         print(item)
 8         return self.info[item]
 9 obj=Foo()
10 obj.name="alex"#这里是引用过来的
11 print(obj.name)

二 进程

1.进程间不可以传递数据,同时也是有主进程的,默认deamon=flase 主进程完毕可以等待子进程

 1 import multiprocessing
 2 import threading
 3 lst=[]
 4 def func(i):
 5     # print("验证可不可以数据间")
 6     lst.append(i)
 7     print( lst)
 8 def run():
 9     for i in  range(10):
10         t1=multiprocessing.Process(target=func,args=(i,))
11         t1.start()
12 if __name__ == '__main__':
13     run()

2.进程也可以分为两种写法 一个是引入模块 multiprocseeing ,另一个是继承父类

class Foo(multiprocessing.Process):
    def run(self):
        a=multiprocessing.current_process()
        print("进程 %s" % a)
def run():
    obj=Foo()
    obj.start()
if __name__ == '__main__':
    run()

3.进程可以通过queue 和 manager 来进行信息共享

queue 在windows  上可能不会运行

 1 import multiprocessing
 2 import threading
 3 import queue
 4 import time
 5 q=multiprocessing.Queue()
 6 def tesk(i,q):
 7     
 8     q.put=(i)#队列用来限制
 9 def run:
10     for i  in  range(10):
11         t1=multiprocessing.Process(target=tesk,args=(i,q,))
12         t1.start()
13     while 1:
14         v1=q.get()#这里有一个循环
15         print(v1)    
16 if __name__ == '__main__':
17     run()

Manager

用字典的形式阻止

 1 def tesk(arg,dic):
 2     time.sleep(5)
 3     dic[arg]=100
 4 if __name__ == '__main__':
 5     m = multiprocessing.Manager()
 6     dic=m.dict()
 7     lst=[]
 8     for i in  range(10):
 9         t1=multiprocessing.Process(target=tesk,args=(i,dic))
10         t1.start()
11         lst.append(t1)
12     while 1:#用来做一个判断 .否则即使程序运行完事也不结束
13         con=0
14         for i in  lst:#这里的i 是每次循环的进程
15             if not i.is_alive():#若果进程不在,说明已经运行完毕,因为子进程还没有结束,
16                 #若是提前结束会报错
17                 con+=1
18         if con==len(lst):#知道相等才停止
19             break
20     print(dic)

4.进程锁

 1 lock=multiprocessing.RLock()
 2 def tesk(i):
 3     print("鬼子来了")
 4     lock.acquire()
 5     time.sleep(2)
 6     print(i)
 7     lock.release()
 8 if __name__ == '__main__':
 9     t1=multiprocessing.Process(target=tesk,args=(1,))
10     t1.start()
11     t2=multiprocessing.Process(target=tesk,args=(1,))
12     t2.start()

5.进程池

1 from  concurrent.futures import  ThreadPoolExecutor,ProcessPoolExecutor
2 def tesk(i):
3     time.sleep(5)
4     print("真想%s" % i)
5 if __name__ == '__main__':
6     m=ProcessPoolExecutor(5)
7     for i  in range(5):
8         m.submit(tesk,i)

猜你喜欢

转载自www.cnblogs.com/zhangqing979797/p/9636358.html