【问题标题】:multiprocessing Programming guidelines unclear多处理编程指南不明确
【发布时间】:2015-01-05 06:25:25
【问题描述】:

我正在尝试理解以下准则:

Better to inherit than pickle/unpickle

当使用 spawn 或 forkserver 启动方法时,来自多处理的许多类型需要是可挑选的,以便子进程可以使用它们。但是,通常应该避免使用管道或队列将共享对象发送到其他进程。相反,您应该安排程序,以便需要访问在其他地方创建的共享资源的进程可以从祖先进程继承它。

  • “安排节目”是什么意思?
  • 如何通过继承共享资源?

我在运行windows,所以产生了新进程,这是否意味着只有分叉的进程才能继承?

【问题讨论】:

  • 注意:FWIW,发送非共享对象是合理的。

标签: python multiprocessing


【解决方案1】:

1。 “安排节目”是什么意思?

这意味着您的程序应该能够在没有任何外部资源的情况下独立运行。共享文件会给你带来锁定问题,共享内存要么会做同样的事情,要么会因为多个进程同时修改数据而给你带来损坏。

这是一个坏主意的例子:

while some_queue_is_not_empty():
    run_external_process(some_queue)

def external_process(queue):
    item = queue.pop()
    # do processing here

对比:

while some_queue_is_not_empty():
    item = queue.pop()
    run_external_process(item)

def external_process(item):
    # do processing here

这样您可以避免由于多个进程获取相同的项目而导致队列锁定和/或损坏问题。

2。如何通过继承共享资源?

在 Windows 上,您不能。在 Linux 上,您可以使用父级打开的文件描述符,在 Windows 上,这将是一个全新的进程,因此除了给定的内容之外,您没有来自父级的任何内容。

示例复制自:http://rhodesmill.org/brandon/2010/python-multiprocessing-linux-windows/

from multiprocessing import Process
f = None

def child():
    print f

if __name__ == '__main__':
    f = open('mp.py', 'r')                                                      
    p = Process(target=child)
    p.start()
    p.join()

在 Linux 上你会得到类似的东西:

$ python mp.py
<open file 'mp.py', mode 'r' at 0xb7734ac8>

在 Windows 上,您将获得:

C:\Users\brandon\dev>python mp.py
None

【讨论】:

猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多