zoukankan      html  css  js  c++  java
  • Python(多进程multiprocessing模块)

    day31

    http://www.cnblogs.com/yuanchenqi/articles/5745958.html

    由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。

    多进程

     1 from multiprocessing import Process#进程
     2 import time
     3 def f(name):
     4     time.sleep(1)
     5     print('hello', name,time.ctime())
     6 
     7 if __name__ == '__main__':
     8     p_list=[]
     9     for i in range(3):#和threading,差不多
    10         p = Process(target=f, args=('alvin',))
    11         p_list.append(p)
    12         p.start()
    13     for i in p_list:
    14         p.join()
    15     print('end')
    16 
    17 #延迟一秒后全部输出

    延迟1面。输出。

    执行结果:

    /home/nizhipeng/PycharmProjects/learnPython/venv/bin/python /home/nizhipeng/PycharmProjects/learnPython/week8/多进程.py
    hello alvin Mon Nov  5 22:25:45 2018
    hello alvin Mon Nov  5 22:25:45 2018
    hello alvin Mon Nov  5 22:25:45 2018
    end
    
    Process finished with exit code 0

    类式调用多线程

     1 from multiprocessing import Process
     2 import time
     3 
     4 class MyProcess(Process):#继承
     5     def __init__(self):
     6         super(MyProcess, self).__init__()
     7         #self.name = name 可以从新赋值
     8 
     9     def run(self):
    10         time.sleep(1)
    11         print ('hello', self.name,time.ctime())#hello MyProcess-3 Mon Nov  5 21:20:11 2018
    12 
    13 
    14 if __name__ == '__main__':
    15     p_list=[]
    16     for i in range(3):
    17         p = MyProcess()
    18         p.start()
    19         p_list.append(p)
    20 
    21     for p in p_list:
    22         p.join()
    23 
    24     print('end')

    使用方式和threading多线程一样。

    执行结果:

    hello MyProcess-1 Mon Nov  5 22:27:51 2018
    hello MyProcess-2 Mon Nov  5 22:27:51 2018
    hello MyProcess-3 Mon Nov  5 22:27:51 2018
    end
    
    Process finished with exit code 0

    进程关系

     1 from multiprocessing import Process
     2 import os
     3 import time
     4 def info(title):
     5     print(title)#传入信息
     6     print('module name:', __name__)#main
     7     print('parent process:', os.getppid())#父进程号
     8     print('process id:', os.getpid())#本进程号
     9 #每一个进程都有根进程
    10 
    11 def f(name):
    12     info('33[31;1mfunction f33[0m')
    13     print('hello', name)
    14 
    15 if __name__ == '__main__':
    16     info('33[32;1mmain process line33[0m')
    17     time.sleep(3)
    18     p = Process(target=info, args=('bob',))#子进程 ,其父进程是主进程
    19     p.start()
    20     p.join()

    执行结果:

    main process line
    module name: __main__
    parent process: 4319
    process id: 1896
    bob
    module name: __main__
    parent process: 1896
    process id: 1929
    
    Process finished with exit code 0

    从输出结果可以看出,子进程p的父进程号1896是主进程号1896。主进程的父进程号是4319。

    每一个进程都有根进程

    主进程与子进程通信Pipe

     1 from multiprocessing import Process, Pipe
     2 
     3 
     4 def f(conn):
     5     conn.send([42, None, 'hello'])#其中conn,为其父进程的child_conn
     6     conn.close()
     7 
     8 
     9 if __name__ == '__main__':
    10     parent_conn, child_conn = Pipe()
    11     p = Process(target=f, args=(child_conn,))
    12     p.start()
    13     print(parent_conn.recv())  # prints "[42, None, 'hello']"#子进程发送,主进程接收
    14     p.join()

    执行结果:

    [42, None, 'hello']
    
    Process finished with exit code 0

    manager实现数据共享

     1 from multiprocessing import Process, Manager
     2 import threading
     3 def f(d, l,n):
     4     d[n] = '1'#n 为0~1个线程,全赋为1
     5     d['2'] = 2
     6     d[0.25] = None
     7     l.append(n)
     8     #print('l:', l)
     9 
    10 if __name__ == '__main__':
    11     with Manager() as manager: #manager = manager()
    12         d = manager.dict()#字典
    13 
    14         l = manager.list(range(5))#初始值为零到四的列表
    15 
    16         p_list = []
    17         for i in range(10):
    18             p = Process(target=f, args=(d, l, i))
    19             #p = threading.Thread(target=f, args=(d, l, i)) #多线程
    20             p.start()
    21             p_list.append(p)
    22 
    23         for res in p_list:
    24             res.join()
    25 
    26         print(d)
    27         print(l)

    执行结果:

    {0.25: None, 1: '1', 2: '1', 3: '1', '2': 2, 5: '1', 6: '1', 7: '1', 8: '1', 9: '1', 4: '1', 0: '1'}
    [0, 1, 2, 3, 4, 1, 0, 6, 2, 3, 7, 4, 8, 9, 5]
    
    Process finished with exit code 0

    d字典中,n 0~9,都赋值为1,其余按要求赋值。

    列表l中,前五个初始为0~4,后十个值由于是多进程,排列顺序随机。

  • 相关阅读:
    hdu 3648 Median Filter (树状数组)
    poj 1470 Closest Common Ancestors (LCA)
    poj 1330 Nearest Common Ancestors (LCA)
    hdu 2586 How far away ? (LCA)
    poj 3253 Fence Repair (哈夫曼)
    poj 1094 Sorting It All Out (拓扑排序)
    hdu 2527 Safe Or Unsafe (哈夫曼树)
    三层架构
    SQL2008、SQL2013 执行Transact-SQL 语句或者批处理时发生了异常。错误5120
    【MediaKit】WPF项目中 调用摄像头拍照的开发包
  • 原文地址:https://www.cnblogs.com/112358nizhipeng/p/9911537.html
Copyright © 2011-2022 走看看