zoukankan      html  css  js  c++  java
  • python基础学习21----进程

    python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。

    进程与线程的使用有很多相似之处,有关线程方面的知识请参考https://www.cnblogs.com/sfencs-hcy/p/9721362.html

    multiprocessing模块

    1.进程的创建

    import multiprocessing
    
    def func(msg):
        print(msg)
        print("这是一个进程")
    if __name__=="__main__":
        p=multiprocessing.Process(target=func,args=("hello world",))
        p.start()

      以继承类的方式创建进程

    import multiprocessing
    class Myprocessing(multiprocessing.Process):
        def __init__(self,name,age):
            multiprocessing.Process.__init__(self)
            self.name=name
            self.age=age
    
        def run(self):
            #这里是将threading.Thread中的run方法进行了重载
           print("%s is %d"%(self.name,self.age))
    if __name__=="__main__":
        t=Myprocessing("sfencs",19)
        t.start()

    2.进程的并行

    import multiprocessing
    import time
    class Myprocessing(multiprocessing.Process):
        def __init__(self,name,age,second):
            multiprocessing.Process.__init__(self)
            self.name=name
            self.second=second
            self.age=age
    
        def run(self):
            print(self.name)
            time.sleep(self.second)
            print(self.age)
    
    if __name__=="__main__":
        time_begin=time.time()
    
        p1=Myprocessing("sfencs",19,2)
        p2=Myprocessing("Tom",25,5)
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        time_end=time.time()
        print(time_end-time_begin)
    '''
    Tom
    19
    25
    5.198107481002808
    '''

    join的用法和线程相同

    3.守护进程

    守护进程与守护线程的原理相同,只不过设置守护进程的方式为p.daemon=True

    4.lock

    lock的作用同多线程,实现方式有两种

    import multiprocessing
    
    def func2(lock,f):
        with lock:
            fs=open(f,'a+')
    
            fs.write('Lockd acquired via with
    ')
    
            fs.close()
    def func1(lock,f):
        lock.acquire()
        fs=open(f,'a+')
        fs.write('Lock acquired directly
    ')
        fs.close()
    
        lock.release()
    if __name__=="__main__":
        lock=multiprocessing.Lock()
        f = "file.txt"
        p1=multiprocessing.Process(target=func2,args=(lock,f,))
        p2=multiprocessing.Process(target=func1,args=(lock,f,))
        p1.start()
        p2.start()
        p1.join()
        p2.join()

    与线程不同的是,这里lock是以参数方式传递,因为不同的进程并不能共享资源

    5.Semaphore

    用来控制对共享资源的最大访问数量

    import multiprocessing
    import time
    
    def func(s, i):
        s.acquire()
        print(multiprocessing.current_process().name + "acquire");
        time.sleep(2)
        print(multiprocessing.current_process().name + "release
    ");
        s.release()
    
    if __name__ == "__main__":
        s = multiprocessing.Semaphore(2)
        for i in range(5):
            p = multiprocessing.Process(target = func, args=(s, 2))
            p.start()

    6.event与线程用法相同

    7.队列

    有一个专门属于多进程的队列multiprocessing.Queue

    import multiprocessing
    
    def writer(q):
       q.put("hello world")
    
    def reader(q):
        print(q.get())
    
    if __name__ == "__main__":
        q = multiprocessing.Queue()
        pwriter=multiprocessing.Process(target=writer,args=(q,))
        preader = multiprocessing.Process(target=reader, args=(q,))
        pwriter.start()
        preader.start()

    8.管道pipe

    Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数,如果duplex参数为True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex为False,conn1只负责接受消息,conn2只负责发送消息。

    import multiprocessing
    
    def sender(p):
       p.send("hello world")
    
    def receiver(p):
        print(p.recv())
    
    if __name__ == "__main__":
        p = multiprocessing.Pipe()
        psender=multiprocessing.Process(target=sender,args=(p[0],))
        preceiver = multiprocessing.Process(target=receiver, args=(p[1],))
        psender.start()
        preceiver.start()

    9.manager

    manager实现进程之间数据共享

    import multiprocessing
    
    def func(list1,d,i):
        list1[i]=i
        d["a"]=i
    
    if __name__ == "__main__":
        with multiprocessing.Manager() as manager:
            list1=manager.list(range(5,10))
            d=manager.dict()
            plist=[]
            for i in range(5):
                p=multiprocessing.Process(target=func,args=(list1,d,i))
                plist.append(p)
                p.start()
            for i in plist:
                i.join()
            print(list1)
            print(d)

    未完

  • 相关阅读:
    sqlserver导入cvs文件
    记录搭建redis集群以及使用过程中踩过的坑
    Linux网络管理工具之mtr
    Linux文本处理三剑客之awk学习笔记12:实战演练
    Linux文本处理三剑客之awk学习笔记11:选项、内置变量和内置函数
    Linux文本处理三剑客之awk学习笔记10:函数
    Linux文本处理三剑客之awk学习笔记09:ARGC和ARGV等
    Linux文本处理三剑客之awk学习笔记08:数组
    Linux文本处理三剑客之awk学习笔记06:输出操作
    Linux文本处理三剑客之awk学习笔记05:getline用法详解
  • 原文地址:https://www.cnblogs.com/sfencs-hcy/p/9744946.html
Copyright © 2011-2022 走看看