我想了解以下准则:
当使用spawn或forkserver start方法时,需要对多处理中的许多类型进行选择,以便子进程可以使用它们。但是,通常应避免使用管道或队列将共享对象发送到其他进程。相反,您应该安排程序,以便需要访问其他地方创建的共享资源的进程可以从祖先进程继承它。
我正在运行Windows,因此生成了新进程,这是否意味着只有分叉进程可以继承?
答案 0 :(得分:4)
这意味着您的程序应该能够在没有任何外部资源的情况下自行运行。共享文件将为您提供锁定问题,共享内存将执行相同操作,或者由于多个进程同时修改数据而导致损坏。
以下是一个不好主意的例子:
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
通过这种方式,您可以避免因多个进程获取相同项而导致锁定队列和/或损坏问题。
在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