笔记目的

python3 多进程学习笔记

Manager 变量陷阱

https://www.jianshu.com/p/52676b93430d

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
  # Manager对象无法监测到它引用的可变对象值的修改,
  # 需要通过触发__setitem__方法来让它获得通知
    from multiprocessing import Process, Manager

  manager = Manager()
  m = manager.list()
  m.append({'id':1})

  def test():
hack = m[0]
hack['id'] = 2
m[0] = hack

  p = Process(target=test)
  p.start()
  p.join()
  print(m[0])

Pool

Queue

在 Pool 中不能直接使用,

解决方法:

使用 Manager().Queue()

捕获异常

1
2
3
4
5
6
7
8
  import multiprocessing
  import Queue  # or queue in Python 3

  f = multiprocessing.Queue()
  try:
f.get(True, 0.1)
  except Queue.Empty:  # Queue here refers to the  module, not a class
print 'foo'

concurrent.futures.ProcessPoolExecutor

注意

  1. ProcessPoolExecutor 如果用到 Queue,需要使用 multiprocessing.Manager.Queue(), 而不是 multiprocessing.Queue()