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())
  • 相关阅读:
    【JavaP6大纲】MySQL篇:如何实现 MySQL 的读写分离?MySQL 主从复制原理是啥?如何解决 MySQL 主从同步的延时问题?
    【JavaP6大纲】MySQL篇:现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统从未分库分表动态切换到分库分表上?
    快速搭建PHP开发环境(PhpStorm+EasyPHP)
    iBatis开发者手册翻译(目录)
    iBatis开发者手册翻译(章节一、引言)
    asp.net 数据操作三步曲(一) :)
    一事归一事
    闲言碎语话心得你给我多少钱
    研发过程之代码评审
    让她自己来
  • 原文地址:https://www.cnblogs.com/xiaoxiao075/p/10390310.html
Copyright © 2011-2022 走看看