• 多进程,进程池。


    1.多进程的调用

    1.1 multiprocessing调用

     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):
    10         p = Process(target=f, args=('alvin',))
    11         p_list.append(p)
    12         p.start()
    13     for i in p_list:
    14         i.join()
    15     print('end')

    运用for循环开启了3个子进程,全都join在主进程中。运行结果:

    1 hello alvin Tue Oct 18 15:10:28 2016
    2 hello alvin Tue Oct 18 15:10:28 2016
    3 hello alvin Tue Oct 18 15:10:28 2016
    4 end

    结果显示:三个字符串同时打印出来。达到了多进程的目的。

    1.2类来调用

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

    同时开启了4个进程,但是并没有直接p.run()指令,但是结果显示:

    1 hello MyProcess-1 Tue Oct 18 15:13:46 2016
    2 hello MyProcess-2 Tue Oct 18 15:13:46 2016
    3 hello MyProcess-3 Tue Oct 18 15:13:46 2016
    4 end

    可以看出:run函数是被自动执行的。self.name因为是被默认为进程的名称。

    小总结:1.上述的四个进程在执行的过程中实现了真正的并发。但是在多过CPU个数的时候。。。

        2.子进程的创建时将主进程完全copy一遍,很占资源的一种形式。

    小细节:win系统中,创建子进程必须加main来标识主,子进程的不同。上述的例子中print(end)若是不在main中会产生影响。

    2.进程之间的关系

     1 from multiprocessing import Process
     2 import os
     3 import time
     4 def info(title):
     5     print(title)
     6     print('module name:', __name__)
     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(5)
    18     p = Process(target=info, args=('bob',))
    19     p.start()
    20     p.join()

    上述的代码中展示了进程的father进程的ID和自身的ID (通过os模块的getppid和getppid)

    1 main process line
    2 module name: __main__
    3 parent process: 11156
    4 process id: 4592
    5 bob
    6 module name: __mp_main__
    7 parent process: 4592
    8 process id: 7280

    结果表明:主进程的名字为main,并且父进程为pycharm的pid。子进程的name不为main所以不会执行main中内容。

    3.进程池

     1 from  multiprocessing import Process, Pool
     2 import time
     3 
     4 def Foo(i):
     5     time.sleep(2)
     6     return i + 100
     7 
     8 
     9 def Bar(arg):
    10     print('-->exec done:', arg)
    11 
    12 if __name__ == '__main__':
    13 
    14     pool = Pool(5)
    15 
    16     for i in range(10):
    17         pool.apply_async(func=Foo, args=(i,), callback=Bar) # 回调函数 每次运行完执行。bar的参数是foo的返回值。、
    18         # pool.apply(func=Foo, args=(i,))
    19     pool.close()
    21     pool.join()
    22   print('end')

    执行结果:没隔2秒钟出现5个执行结果

     1 -->exec done: 100
     2 -->exec done: 101
     3 -->exec done: 102
     4 -->exec done: 103
     5 -->exec done: 104
     6 -->exec done: 105
     7 -->exec done: 106
     8 -->exec done: 107
     9 -->exec done: 108
    10 -->exec done: 109
    11 end
  • 相关阅读:
    剑指 Offer 46. 把数字翻译成字符串
    剑指 Offer 45. 把数组排成最小的数
    1319.连通网络的操作次数-并查集
    数字序列中某一位的数字
    989.数组形式的整数加法
    java多线程
    剑指offer 48 -最长不含重复字符的子字符串 动态规划
    springboot 使用 lombok插件中的@data 注解
    netty 转发服务
    在静态方法中获取properties /yml 配置文件中的信息
  • 原文地址:https://www.cnblogs.com/khal-Cgg/p/5973536.html
Copyright © 2020-2023  润新知