1. 20python中的多进程模块multiprocessing与进程池pool_笔记
    2. # multiprocessing库的出现很大程度上是为了弥补threading库因为GIL低效的缺陷。
    3. # 它完整的复制了一套threading所提供的接口方便迁移。
    4. # 唯一的不同就是它使用了多进程而不是多线程。
    5. # 每个进程有自己的独立的GIL,完全并行,无GIL的限制(进程中包括线程),
    6. # 可充分利用多cpu多核的环境,因此也不会出现进程之间的GIL争抢。
    7. # 进程间虽然不能共享某一个内存空间 但是进程间可以通行
    8. # python多进程并发,模块名称:multiprocessing
    9. # python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程
    10. # 借助这个包,可以轻松完成从单进程到多进程并发执行的转换。
    11. # multiprocessing包是Python中的多进程管理包。与threading.Thread类似,
    12. # 它可以利用multiprocessing.Process对象来创建一个进程。
    13. # 该Process对象与Thread对象的用法相同,也有start(), run(), join()等方法。
    14. # 此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),
    15. # 用以同步进程,其用法与threading包中的Thread类一致。
    16. # 所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。
    17. # multiprocessing提供了threading包中没有的IPC(比如Pipe和Queue),效率上更高。
    18. # 应优先考虑Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式 (因为它们占据的不是用户进程的资源,而是线程)。
    19. # 同步执行:一个进程在执行任务时,另一个进程必须等待执行完毕,才能继续执行,
    20. # 加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改.
    21. # 没错,速度是慢了,但牺牲了速度却保证了数据安全。
    22. # 异步执行:一个进程在执行任务时,另一个进程无需等待其执行完毕就可以执行,
    23. # 当有消息返回时,系统会提醒后者进行处理,这样会很好的提高运行效率
    24. # -*- coding: utf-8 -*-
    25. __author__ = 'dongfangyao'
    26. __date__ = '2018/1/17 下午6:07'
    27. __product__ = 'PyCharm'
    28. __filename__ = 'processing1'
    29. # 多进程
    30. import time
    31. import multiprocessing
    32. # 单进程
    33. # def work_1(filename, n):
    34. # print('work_1 start')
    35. # for i in range(n):
    36. # with open(filename, 'a') as f_obj:
    37. # f_obj.write('i love python \n')
    38. # time.sleep(1)
    39. # print('work_1 end')
    40. #
    41. #
    42. # def work_2(filename, n):
    43. # print('work_2 start')
    44. # for i in range(n):
    45. # with open(filename, 'a') as f_obj:
    46. # f_obj.write('www.ai111.vip come on! \n')
    47. # time.sleep(1)
    48. # print('work_2 end')
    49. #
    50. # work_1('dfy.txt', 3)
    51. # work_2('dfy.txt', 4)
    52. # 多进程
    53. # def work_1(filename, n):
    54. # print('work_1 start')
    55. # for i in range(n):
    56. # with open(filename, 'a') as f_obj:
    57. # f_obj.write('i love python \n')
    58. # time.sleep(1)
    59. # print('work_1 end')
    60. #
    61. #
    62. # def work_2(filename, n):
    63. # print('work_2 start')
    64. # for i in range(n):
    65. # with open(filename, 'a') as f_obj:
    66. # f_obj.write('www.ai111.vip come on! \n')
    67. # time.sleep(1)
    68. # print('work_2 end')
    69. #
    70. # p1 = multiprocessing.Process(target=work_1, args=('dfy.txt', 3))
    71. # p2 = multiprocessing.Process(target=work_2, args=('dfy.txt', 4))
    72. #
    73. # p1.start()
    74. # p2.start()
    75. # 同步执行 异步执行
    76. # 加锁 同步
    77. def work_1(filename, n, lock):
    78. print('work_1 start')
    79. lock.acquire()
    80. for i in range(n):
    81. with open(filename, 'a') as f_obj:
    82. f_obj.write('i love python \n')
    83. time.sleep(1)
    84. print('work_1 end')
    85. lock.release()
    86. def work_2(filename, n, lock):
    87. print('work_2 start')
    88. lock.acquire()
    89. for i in range(n):
    90. with open(filename, 'a') as f_obj:
    91. f_obj.write('www.ai111.vip come on! \n')
    92. time.sleep(1)
    93. print('work_2 end')
    94. lock.release()
    95. lock = multiprocessing.Lock()
    96. p1 = multiprocessing.Process(target=work_1, args=('dfy.txt', 3, lock))
    97. p2 = multiprocessing.Process(target=work_2, args=('dfy.txt', 4, lock))
    98. p1.start()
    99. p2.start()
    100. 复制代码
    101. # pool 进程池
    102. # Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,
    103. # 如果池还没有满,那么就会创建一个新的进程用来执行该请求;
    104. # 但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行它。
    105. # 进程池方法:
    106. # apply(func[, args[, kwds]]): 阻塞的执行,比如创建一个有3个线程的线程池,当执行时是创建完一个,执行完函数再创建另一个,变成一个线性的执行. apply_async(func[, args[, kwds[, callback]]]) : 它是非阻塞执行,同时创建3个线程的线城池,同时执行,只要有一个执行完立刻放回池子待下一个执行,并行的执行 .
    107. # close(): 关闭pool,使其不在接受新的任务。
    108. # terminate() : 结束工作进程,不在处理未完成的任务。
    109. # join(): 主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用。
    110. # -*- coding: utf-8 -*-
    111. __author__ = 'dongfangyao'
    112. __date__ = '2018/1/17 下午6:21'
    113. __product__ = 'PyCharm'
    114. __filename__ = 'processing2'
    115. import os
    116. import multiprocessing
    117. import time
    118. # 进程池 pool
    119. def work(n):
    120. print('run work(%s) start, work id :%s'%(n, os.getpid()))
    121. time.sleep(3)
    122. print('work(%s) end, work id :%s'%(n, os.getpid()))
    123. print('父进程 id: %s'%os.getpid())
    124. # 创建一个进程池 里面同时2个子进程
    125. p = multiprocessing.Pool(2)
    126. for i in range(5):
    127. # 5个任务去提交进程池
    128. # p.apply(work, args=(i, ))
    129. p.apply_async(work, args=(i, ))
    130. p.close()
    131. # p.terminate()
    132. p.join()
    133. print('父进程结束')
    134. 复制代码