【问题标题】:how to use python's multiprocessing module如何使用python的多处理模块
【发布时间】:2015-02-15 20:21:16
【问题描述】:

我正在使用 Intel 的 Pentium(R)Dual-core E5700 @3.00GHz 和 2GB 内存。 我正在尝试学习 Python 的 multiprocessing 模块。我写了一个简单的程序来执行加法,但它不起作用;我只是获得核心 2 的数量。我的电脑或代码有问题吗?

import multiprocessing
print "number of core ",multiprocessing.cpu_count()



def calc(a,b):
    c= a+b
    return c

if __name__ =='__main__':

    p1 = multiprocessing.Process(target=calc,args=(3,5) )
    p1.start()
    p2 = multiprocessing.Process(target=calc,args=(2,2) )
    p2.start()



p1.join()
p2.join()

【问题讨论】:

  • 将return c更改为print c
  • 为什么将返回更改为打印,当我将其称为 calc(2,3) 我得到 5 时,它的功能完美无缺
  • 如果你有一个双核机器,那么你的 CPU 数量是两个。是什么让你认为这是错误的?你期待它是什么?
  • k..那么你怎么知道你的prgm执行了这个函数?你也得到number of core 2。那么你的程序面临的问题是什么?
  • 从您的问题中不清楚程序的哪个部分不起作用。你看到了什么行为?您希望看到什么行为?

标签: python multiprocessing python-multiprocessing


【解决方案1】:

我建议你使用Queue。看这个例子:

from multiprocessing import Queue, Process

def calc(a, b, queue):
    queue.put(a + b)

if __name__ == '__main__':
    queue = Queue()
    p1 = Process(target = calc, args = (4, 4, queue,))
    p2 = Process(target = calc, args = (4, 4, queue,))
    p1.start()
    p2.start()
    result_1 = queue.get()
    result_2 = queue.get()
    print(result_1, result_2)
    p1.join()
    p2.join()
    input()

>>> 8 8

动态相同的代码:

from multiprocessing import Queue, Process, cpu_count

def calc(a, b, queue):
    queue.put(a + b)

if __name__ == '__main__':
    queue = Queue()
    processes = []
    for i in range(cpu_count()):
        processes.append(Process(target = calc, args = (4, 4, queue,)))
        processes[-1].start()
    results = []
    for i in range(cpu_count()):
        results.append(queue.get())
    print(results)
    for process in processes:
        process.join()

>>> [8, 8] # if you have two cores

【讨论】:

  • 你的两个例子有时它的工作,有时它的堵塞 ide 像 while 循环,我认为多处理在 Windows 上不能正常工作
  • 它有效...检查您是否没有使用 IDLE 运行代码,并且在 msconfig 的启动高级选项中,配置允许您使用所有内核。
【解决方案2】:

一切正常,包括我在 pycharm 下的 calc 程序,唯一的问题是 IDE,我使用的是 pyscripter

【讨论】:

    【解决方案3】:

    在您的calc 函数中,您需要将return 更改为print。在我的四核机器(运行 OS X Mavericks)上,这是我在终端中运行脚本时的输出。您还应该将p1.join() 和p2.join() 作为if __name__ == "__main__ 的一部分。

    Last login: Sun Feb 15 15:47:18 on ttys001
    imac:~ zinedine$ cd '/Users/zinedine/Documents/' && '/usr/local/bin/pythonw'
    '/Users/zinedine/Documents/example.py'  && echo Exit status: $? && exit 1
    number of cores  4
    8
    4
    Exit status: 0
    logout
    
    [Process completed]
    

    我在终端中使用的代码...

    import multiprocessing
    
    print "number of cores ", multiprocessing.cpu_count()
    
    def calc(a, b):
        c = a + b
        return c
    
    if __name__ == "__main__":
        p1 = multiprocessing.Process(target = calc, args = (3, 5) )
        p1.start()
    
        p2 = multiprocessing.Process(target = calc, args = (2, 2) )
        p2.start()
    
        p1.join()
        p2.join()
    

    使用Python Launcher.app 后,它会在终端中打开,并给出我上面给出的输出...

    【讨论】:

    • 我还是没有工作 import multiprocessing print "number of core ",multiprocessing.cpu_count() def calc(a,b): c= a+b print c if name =='main': p1 = multiprocessing.Process(target=calc,args=(3,5) ) p1.start() p2 = multiprocessing.Process(target=calc,args=( 2,2) ) p2.start() p1.join() p2.join()
    • 你为什么要做from multiprocessing import Process和import multiprocessing?只需做一个简单的import multiprocessing。但这不是重点。你认为你可以对描述你的输出的问题进行编辑吗?
    • 这个脚本只能作为python文件运行。由于处理在if __name__ =='__main__':下完成。所以p1.join()和p2.join不需要缩进。无论如何它都会执行
    • 不,我不做导入多处理,我做导入多处理你可以在你的终端测试我的代码,对不起我有点困惑
    • @latheefitzmeontv 不缩进实际上是一个错误。在 Windows 上,该代码将在每个子进程中执行,而 if __name__ ... 块中的代码不会。显然这是不可取的,因为它会使两个子进程都崩溃。如果您要导入模块而不是直接执行它,则会遇到同样的问题。
    猜你喜欢
    • 2011-04-04
    • 2017-12-11
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    相关资源
    最近更新 更多