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()
    

      

     

      

  • 相关阅读:
    java集合总结
    css基础:块级元素与行内元素
    第九周web作业:history of grammar
    正则表达式(regular expression rules)
    用indexOf查找字符出现次数
    DOM与BOM的概念
    css的单位以及调色法
    获取登录cookieColletion在cef里面打开网页
    引用CefSharp编译支持AnyCpu的办法
    解决H5移动端history.back无效
  • 原文地址:https://www.cnblogs.com/fujian-code/p/8977862.html
Copyright © 2011-2022 走看看