zoukankan      html  css  js  c++  java
  • 多线程 multiprocessing 的几个小例子

    1、Pipe

    import multiprocessing as multip,time
    from multiprocessing import Process,Pipe,Event,Condition,Lock,Pool,Value,Array
    
    def pipe1(pipe):
        pipe.send('hello')
        print('p1.recv1',pipe.recv())
        pipe.send('what is your name??')
        print('p1.recv2',pipe.recv())
    
    def pipe2(pipe):
        print('p2.recv1',pipe.recv())
        pipe.send('hello,too')
        print('p2.recv2',pipe.recv())
        pipe.send('i do not tell you!!')
    
    if __name__=='__main__':
        pipe=Pipe()
    
        p1=Process(target=pipe1,args=(pipe[0],))
        p2=Process(target=pipe2,args=(pipe[1],))
    
        p1.start()
        p2.start()
        #p1.join()
        #p2.join()
    
        print('主程序结束运行')

    2、Event

    def event1(e):
        print('event1 开始运行:')
        e.wait()
        print('event1 等待结束:')
    
    def event2(e,t):
        print('event2 开始运行:')
        e.wait(t)
        print('event2 等待超时结束:')
        e.set()
    
    if __name__=='__main__':
    
        e=Event()
    
        p1=Process(target=event1,args=(e,))
        p2=Process(target=event2,args=(e,4))
        
        p1.start()
        p2.start()
    
        time.sleep(3)
        print('主程序运行结束!')

    3、Condition

    def cond1(cond):
        with cond:
            print('cond1 开始运行',multip.current_process().name)
            cond.wait()
            print('cond1 等待结束',multip.current_process().name)
    
    def cond2_notify(cond):
        with cond:
            print('cond2 开始运行',multip.current_process().name)
            cond.notify_all()#notify() 只通知一个等待的condition
            print('cond2 notifyall结束',multip.current_process().name)
    
    if __name__=='__main__':
    
        con=Condition()
    
        p1=Process(target=cond1,args=(con,))
        p2=Process(target=cond1,args=(con,))
        p3=Process(target=cond2_notify,args=(con,))
        
        p1.start()
        p2.start()
        time.sleep(4)
        p3.start()
    
        time.sleep(3)
        print('主程序运行结束!')

    4、Lock

    def func(lock):
    #def func():
        lock.acquire()
        print('进程锁之后开始运行:',multip.current_process().name)
        time.sleep(2)
        print('下面释放进程锁:',multip.current_process().name)
        lock.release()
    
    if __name__=='__main__':
    
        lock=Lock()
        for i in range(10):
            p1=Process(target=func,args=(lock,))
            p1.start()
        
        time.sleep(3)
        print('主程序运行结束!')

    5、Pool

    def func(n):
        time.sleep(0.2)
        return n**2
    if __name__=='__main__':
        pool=Pool(3)
        ll=list(range(10))
        result=pool.map(func,ll)
        print('result:',result)

    6、进程间共享变量 (后面补充)

    class Counter():
        def __init__(self,ini=0):
            self.val=Value('i',ini)
            self.lock=Lock()
        def increment(self):
            with self.lock:
            
                self.val.value+=1
            print('共享变量val自增1次:',self.value())#在调用value()时,如果2个锁重叠,可能会死锁
            
        def value(self):
            #with self.lock:
            return self.val.value
            
    def func(counter):
        for i in range(5):
            time.sleep(0.01)
            counter.increment()
    
    if __name__=='__main__':
        counter=Counter(0)
        ps=[Process(target=func,args=(counter,)) for i in range(5)]
        for i in ps:
            i.start()
        for i in ps:
            i.join()
        print('counter.value():',counter.value())
  • 相关阅读:
    C# WinForm API 改进单实例运行
    CF1310D Tourism [随机化]
    CF1311E Construct the Binary Tree
    [IOI2018] werewolf 狼人 [kruskal重构树+主席树]
    #6029. 「雅礼集训 2017 Day1」市场 [线段树]
    P5840 [COCI2015]Divljak [AC自动机,链并]
    CF547E Mike and Friends [AC自动机,离线树状数组]
    P5112 FZOUTSY
    CF 150E Freezing with Style [长链剖分,线段树]
    CF1230E Kamil and Making a Stream
  • 原文地址:https://www.cnblogs.com/xiaoxiao075/p/10390310.html
Copyright © 2011-2022 走看看