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

    1-

    什么是 Multiprocessing

    和 threading 的比较 

    多进程 Multiprocessing 和多线程 threading 类似, 他们都是在 python 中用来并行运算的. 不过既然有了 threading, 为什么 Python 还要出一个 multiprocessing 呢? 原因很简单, 就是用来弥补 threading 的一些劣势, 比如在 threading 教程中提到的GIL.

    使用 multiprocessing 也非常简单, 如果对 threading 有一定了解的朋友, 你们的享受时间就到了. 因为 python 把 multiprocessing 和 threading 的使用方法做的几乎差不多. 这样我们就更容易上手. 也更容易发挥你电脑多核系统的威力了!

    2-

    添加进程 Process

    导入线程进程标准模块

    import multiprocessing as mp
    import threading as td
    

      

    定义一个被线程和进程调用的函数

    def job(a,d):
        print('aaaaa')
    

      

    创建线程和进程

    t1 = td.Thread(target=job,args=(1,2))
    p1 = mp.Process(target=job,args=(1,2))
    

      

    注意:Thread和Process的首字母都要大写,被调用的函数没有括号,被调用的函数的参数放在args(…)中

    分别启动线程和进程

    t1.start()
    p1.start()
    

      分别连接线程和进程

    t1.join()
    p1.join()
    

      

    完整的线程和进程创建使用对比代码

    import multiprocessing as mp
    import threading as td
    
    def job(a,d):
        print('aaaaa')
    
    t1 = td.Thread(target=job,args=(1,2))
    p1 = mp.Process(target=job,args=(1,2))
    t1.start()
    p1.start()
    t1.join()
    p1.join()
    

      

    运用

    if __name__=='__main__':
    

      完整的应用代码:

    import multiprocessing as mp
    
    def job(a,d):
        print('aaaaa')
    
    if __name__=='__main__':
        p1 = mp.Process(target=job,args=(1,2))
        p1.start()
        p1.join()
    

      运行环境要在terminal环境下,可能其他的编辑工具会出现运行结束后没有打印结果,在terminal中的运行后打印的结果为:

    aaaaa
    

      

    #3-queue
    # View more python learning tutorial on my Youtube and Youku channel!!! # Youtube video tutorial: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg # Youku video tutorial: http://i.youku.com/pythontutorial import multiprocessing as mp def job(q): res = 0 for i in range(1000): res += i+i**2+i**3 q.put(res) # queue if __name__ == '__main__': q = mp.Queue() p1 = mp.Process(target=job, args=(q,)) p2 = mp.Process(target=job, args=(q,)) p1.start() p2.start() p1.join() p2.join() res1 = q.get() res2 = q.get() print(res1+res2)

      

    #4-comparison
    # View more python learning tutorial on my Youtube and Youku channel!!!
    
    # Youtube video tutorial: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg
    # Youku video tutorial: http://i.youku.com/pythontutorial
    
    import multiprocessing as mp
    import threading as td
    import time
    
    def job(q):
        res = 0
        for i in range(1000000):
            res += i+i**2+i**3
        q.put(res) # queue
    
    def multicore():
        q = mp.Queue()
        p1 = mp.Process(target=job, args=(q,))
        p2 = mp.Process(target=job, args=(q,))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        res1 = q.get()
        res2 = q.get()
        print('multicore:' , res1+res2)
    
    def normal():
        res = 0
        for _ in range(2):
            for i in range(1000000):
                res += i+i**2+i**3
        print('normal:', res)
    
    def multithread():
        q = mp.Queue()
        t1 = td.Thread(target=job, args=(q,))
        t2 = td.Thread(target=job, args=(q,))
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        res1 = q.get()
        res2 = q.get()
        print('multithread:', res1+res2)
    
    if __name__ == '__main__':
        st = time.time()
        normal()
        st1= time.time()
        print('normal time:', st1 - st)
        multithread()
        st2 = time.time()
        print('multithread time:', st2 - st1)
        multicore()
        print('multicore time:', time.time()-st2)
    
    #5-pool
    # View more python learning tutorial on my Youtube and Youku channel!!!
    
    # Youtube video tutorial: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg
    # Youku video tutorial: http://i.youku.com/pythontutorial
    
    import multiprocessing as mp
    
    def job(x):
        return x*x
    
    def multicore():
        pool = mp.Pool(processes=2)
        res = pool.map(job, range(10))
        print(res)
        res = pool.apply_async(job, (2,))
        print(res.get())
        multi_res =[pool.apply_async(job, (i,)) for i in range(10)]
        print([res.get() for res in multi_res])
    
    if __name__ == '__main__':
        multicore()
    

     6-共享内存

    Shared Value

    我们可以通过使用Value数据存储在一个共享的内存表中。

     

    import multiprocessing as mp
    
    value1 = mp.Value('i', 0) 
    value2 = mp.Value('d', 3.14)
    

      其中di参数用来设置数据类型的,d表示一个双精浮点类型,i表示一个带符号的整型。更多的形式请查看本页最后的表.

    Shared Array 

    在Python的mutiprocessing中,有还有一个Array类,可以和共享内存交互,来实现在进程之间共享数据。

    array = mp.Array('i', [1, 2, 3, 4])
    

      

    这里的Array和numpy中的不同,它只能是一维的,不能是多维的。同样和Value 一样,需要定义数据形式,否则会报错。 我们会在后一节举例说明这两种的使用方法.

    错误形式

    array = mp.Array('i', [[1, 2], [3, 4]]) # 2维list
    
    """
    TypeError: an integer is required
    """
    

      



    各参数代表的数据类型
    | Type code | C Type             | Python Type       | Minimum size in bytes |
    | --------- | ------------------ | ----------------- | --------------------- |
    | `'b'`     | signed char        | int               | 1                     |
    | `'B'`     | unsigned char      | int               | 1                     |
    | `'u'`     | Py_UNICODE         | Unicode character | 2                     |
    | `'h'`     | signed short       | int               | 2                     |
    | `'H'`     | unsigned short     | int               | 2                     |
    | `'i'`     | signed int         | int               | 2                     |
    | `'I'`     | unsigned int       | int               | 2                     |
    | `'l'`     | signed long        | int               | 4                     |
    | `'L'`     | unsigned long      | int               | 4                     |
    | `'q'`     | signed long long   | int               | 8                     |
    | `'Q'`     | unsigned long long | int               | 8                     |
    | `'f'`     | float              | float             | 4                     |
    | `'d'`     | double             | float             | 8                     |
    

     

    #7-lock
    # View more python learning tutorial on my Youtube and Youku channel!!!
    
    # Youtube video tutorial: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg
    # Youku video tutorial: http://i.youku.com/pythontutorial
    
    import multiprocessing as mp
    import time
    
    def job(v, num, l):
        l.acquire()
        for _ in range(10):
            time.sleep(0.1)
            v.value += num
            print(v.value)
        l.release()
    
    def multicore():
        l = mp.Lock()
        v = mp.Value('i', 0)
        p1 = mp.Process(target=job, args=(v, 1, l))
        p2 = mp.Process(target=job, args=(v, 3, l))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
    
    if __name__ == '__main__':
        multicore()
    

      

     

      

  • 相关阅读:
    让owncloud成为微博式记事本
    软件即抽象
    十年,最后一个alpha,0.4.1版的reactos终于变得可赏可玩了
    使用群晖作mineportalbox(1):合理且不折腾地使用群晖硬件和套件
    使用群晖作mineportalbox(2):把webstation打造成snippter空间
    使用群晖作mineportalbox(3):在阿里云上单盘安装群晖skynas
    统一的分布式数据库和文件系统mongodb,及其用于解决aliyun上做站的存储成本方案
    吃桃
    1020: C语言程序设计教程(第三版)课后习题6.9
    分数序列
  • 原文地址:https://www.cnblogs.com/fujian-code/p/8977862.html
Copyright © 2011-2022 走看看