zoukankan      html  css  js  c++  java
  • python多进程

    python的多线程不适合CPU密集型的任务,适合IO【文件读写,网络数据】密集型的任务

    1.多进程

    import multiprocessing
    import time
    
    def run(name):
        time.sleep(2)
        print('name', name)
    
    if __name__ == '__main__':
        p = multiprocessing.Process(target=run, args=('bob', ))
        p.start()

    获取进程ID:

      os.getppid()   --父进程

      os.getpid()   ---当前进程的id

    进程间通信

    利用中间件queue.Queue,可以实现线程间通信:

      q = queue.Queue()

      q.put(value)

      q.get()

    利用中间件Queue实现进程通信:

    from multiprocessing import Process, Queue
     
    def f(q):
        q.put([42, None, 'hello'])
     
    if __name__ == '__main__':
        q = Queue()
        p = Process(target=f, args=(q,))
        p.start()
        print(q.get())    # prints "[42, None, 'hello']"
        p.join() #等待进程结束

    使用pipes实现进程通信:

      child_conn发送一次,parent_conn只能接受一次

    from multiprocessing import Process, Pipe
     
    def f(conn):
        conn.send([42, None, 'hello'])  #发送端口
        conn.close()
     
    if __name__ == '__main__':
        parent_conn, child_conn = Pipe()  # 管道的两头
        p = Process(target=f, args=(child_conn,))
        p.start()
        print(parent_conn.recv())   # prints "[42, None, 'hello']"  接受端
        p.join()

    使用manager实现线程间数据共享

    from multiprocessing import Process, Manager
     
    def f(d, l):
        d[1] = '1'
        d['2'] = 2
        d[0.25] = None
        l.append(1)
        print(l)
     
    if __name__ == '__main__':
        with Manager() as manager:
            d = manager.dict()
     
            l = manager.list(range(5))
            p_list = []
            for i in range(10):
                p = Process(target=f, args=(d, l))
                p.start()
                p_list.append(p)
            for res in p_list:
                res.join()
     
            print(d)
            print(l)
  • 相关阅读:
    CLR via C#(04) 本是同根生
    CLR via C#(01).NET平台下代码是怎么跑起来的
    CLR via C#(02)基元类型、引用类型、值类型
    Mysql定期自动备份
    Extjs4 图片上传 预览
    inno setup打包应用程序
    bat批处理学习
    localhost/127.0.0.1/本机IP的区别以及端口号
    VirtualBox虚拟机上安装windows7系统
    Linux系统中Oracle11g数据库的安装与验证
  • 原文地址:https://www.cnblogs.com/zhuxiang1633/p/9377034.html
Copyright © 2011-2022 走看看