代码之家  ›  专栏  ›  技术社区  ›  fractals Francisco Flores

Python多处理:不使用单独的内存空间?

  •  1
  • fractals Francisco Flores  · 技术社区  · 7 年前

    据我所知, multiprocessing 使用 fork 在Linux上,这意味着由 多处理 有自己的内存空间,内部所做的任何更改都不会影响其他 ed流程。

    但我遇到了一个相当奇怪的情况:

    import multiprocessing
    
    i = -1
    
    def change(j):
        global i
        print(i, end=" ")  # should print -1
        i = j 
    
    with multiprocessing.Pool(20) as p:
        p.map(change, range(20))
    
    print(i)  # should print -1
    

    我以为这个程序能打印出21 -1 ,作为 多处理 i = j 不会影响 i i = -1 在印刷时。

    -1

    例子:

    -1 -1 -1 -1 -1 4 -1 5 -1 6 -1 8 -1 -1 14 -1 -1 12 -1 -1 -1
    

    所以我的问题是, -1 ?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Nizam Mohamed    7 年前

    介绍了Python3.2 maxtasksperchild

    Maxtasksperchild是工作进程在退出并替换为新的工作进程之前可以完成的任务数,以释放未使用的资源。默认的maxtasksperchild为None,这意味着工作进程将与池一样长。

    import multiprocessing
    
    i = -1
    
    def change(j):
        global i
        print(i, end=" ")  # should print -1
        i = j 
    
    if __name__ == '__main__':
        with multiprocessing.Pool(20, maxtasksperchild=1) as p:
            p.map(change, range(20))
        print(i)  # should print -1
    
        2
  •  1
  •   Lie Ryan Bryan    7 年前

    多处理.池不保证每个任务将在新进程中运行。事实上,你使用多处理.池用于创建新进程的成本被认为昂贵的任务,因此您希望使用进程池来避免该进程创建开销。的典型使用模式多处理.池即创建大量任务,然后创建一个包含少量工作线程的池(通常取决于计算机拥有的CPU核数),池将把任务调度给工作线程,并在可能的情况下重用进程。如果你想总是开始一个新的过程,你应该使用多处理过程.

        3
  •  1
  •   Darkonaut    7 年前

    Pool(20) 创建20个流程 立即 inqueue 以后由工人处理。

    进程运行 multiprocessing.pool.worker -编码,直到他们到达 .get() 排队 -1 .