Python中的多处理以处理参数列表

Python中的多处理以处理参数列表,python,python-2.7,multiprocessing,Python,Python 2.7,Multiprocessing,我正在用python编写我的第一个多处理程序 我想创建一个要处理的值列表,8个进程(os CPU核心数)将使用和处理该值列表 我编写了以下python代码: __author__ = 'Rui Martins' from multiprocessing import cpu_count, Process, Lock, Value def proc(lock, number_of_active_processes, valor): lock.acquire() number_o

我正在用python编写我的第一个多处理程序

我想创建一个要处理的值列表,8个进程(os CPU核心数)将使用和处理该值列表

我编写了以下python代码:

__author__ = 'Rui Martins'

from multiprocessing import cpu_count, Process, Lock, Value

def proc(lock, number_of_active_processes, valor):
    lock.acquire()
    number_of_active_processes.value+=1
    print "Active processes:", number_of_active_processes.value
    lock.release()
    # DO SOMETHING ...
    for i in range(1, 100):
        valor=valor**2
    # (...)
    lock.acquire()
    number_of_active_processes.value-=1
    lock.release()

if __name__ == '__main__':
    proc_number=cpu_count()
    number_of_active_processes=Value('i', 0)
    lock = Lock()
    values=[11, 24, 13, 40, 15, 26, 27, 8, 19, 10, 11, 12, 13]
    values_processed=0

    processes=[]
    for i in range(proc_number):
        processes+=[Process()]
    while values_processed<len(values):
        while number_of_active_processes.value < proc_number and values_processed<len(values):
            for i in range(proc_number):
                if not processes[i].is_alive() and values_processed<len(values):
                    processes[i] = Process(target=proc, args=(lock, number_of_active_processes, values[values_processed]))
                    values_processed+=1
                    processes[i].start()

            while number_of_active_processes.value == proc_number:
                # BUG: always number_of_active_processes.value == 8 :(
                print "Active processes:", number_of_active_processes.value

    print ""
    print "Active processes at END:", number_of_active_processes.value
\uuuuuuuuuuuuuuuuuuuuuuu作者='Rui Martins'
从多处理导入cpu_计数、进程、锁、值
def proc(锁定、活动进程数、valor):
lock.acquire()
活动进程的数目。值+=1
打印“活动进程:”,活动进程数。值
lock.release()
#做点什么。。。
对于范围(1100)内的i:
勇气=勇气**2
# (...)
lock.acquire()
活动进程的数目。值-=1
lock.release()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
进程号=cpu计数()
活动进程的数量=值('i',0)
lock=lock()
值=[11,24,13,40,15,26,27,8,19,10,11,12,13]
处理的值=0
进程=[]
对于范围内的i(过程编号):
进程+=[Process()]

当处理值时,将代码简化为以下内容:

def proc(lock, number_of_active_processes, valor):
    lock.acquire()
    number_of_active_processes.value += 1
    print("Active processes:", number_of_active_processes.value)
    lock.release()
    # DO SOMETHING ...
    for i in range(1, 100):
        print(valor)
        valor = valor **2
    # (...)
    lock.acquire()
    number_of_active_processes.value -= 1
    lock.release()


if __name__ == '__main__':
    proc_number = cpu_count()
    number_of_active_processes = Value('i', 0)

    lock = Lock()
    values = [11, 24, 13, 40, 15, 26, 27, 8, 19, 10, 11, 12, 13]
    values_processed = 0

    processes = [Process() for _ in range(proc_number)]
    while values_processed < len(values)-1:
        for p in processes:
            if not p.is_alive():
                p = Process(target=proc,
                            args=(lock, number_of_active_processes, values[values_processed]))
                values_processed += 1
                p.start()
for i in range(1, 100):
    print(valor)
    valor = valor *2
只需将循环更改为以下内容:

def proc(lock, number_of_active_processes, valor):
    lock.acquire()
    number_of_active_processes.value += 1
    print("Active processes:", number_of_active_processes.value)
    lock.release()
    # DO SOMETHING ...
    for i in range(1, 100):
        print(valor)
        valor = valor **2
    # (...)
    lock.acquire()
    number_of_active_processes.value -= 1
    lock.release()


if __name__ == '__main__':
    proc_number = cpu_count()
    number_of_active_processes = Value('i', 0)

    lock = Lock()
    values = [11, 24, 13, 40, 15, 26, 27, 8, 19, 10, 11, 12, 13]
    values_processed = 0

    processes = [Process() for _ in range(proc_number)]
    while values_processed < len(values)-1:
        for p in processes:
            if not p.is_alive():
                p = Process(target=proc,
                            args=(lock, number_of_active_processes, values[values_processed]))
                values_processed += 1
                p.start()
for i in range(1, 100):
    print(valor)
    valor = valor *2
最后创建的编号为:

 6021340351084089657109340225536
使用您自己的代码时,您似乎陷入了困境,但在for循环中,valor正在向数字增长,数字数多达:

167609
180908
185464
187612
209986
236740
209986

在…

上,问题不在于您的多处理代码。它是for循环中的pow操作符:

for i in range(1, 100):
        valor=valor**2
最终的结果将是pow(val,2**100),这太大了,计算它将花费太多的时间和内存。所以你在上一次考试中出现了内存不足的错误

4 GB = 4 * pow(2, 10) * pow(2, 10) * pow(2, 20) * 8 bit = 2**35 bit
对于最小的数字8:

pow(8, 2**100) = pow(2**3, 2**100) = pow(2, 3*pow(2, 100))
pow(2, 3*pow(2, 100))bit/4GB = 3*pow(2, 100-35) = 3*pow(2, 65)

它需要3*pow(2,65)倍的4GB内存。

Daniel Sanchez,我认为多处理与线程不同,GIL没有被多处理锁定。请看:是的,我在发布了我的愚蠢想法后就考虑过了,对不起:/Hi,谢谢,但我认为您不能更改代码,因为您的代码使用了8个以上的进程,因为当您执行“p=Process(…”)时,您将创建并启动一个新的进程,但不会替换原始列表os进程中的“p”,以及“如果不是p,则p.is_alive()“所有时间都将返回”True“。例如:lista=range(15)print lista for l in lista:print l l=0 print listaSorry,我的英语说得不太好,但是,在我的代码中,我只运行8个进程(同时),在你的代码中,你运行13个进程(因为是“值”的大小”。问题是,您的代码是正确的并且可以工作,但我需要每个进程都尽可能快,然后我只运行8个进程,每个进程都有一个值,每次一个进程完成时,我都会运行一个新进程,直到每个值都被处理。感谢您的帮助:)真的吗answer@RuiMartins,
进程=[Process()用于uu in range(proc_number)]
并且仅在流程列表上循环与代码中的索引逻辑完全相同,您可以在希望
流程[i]=Process时使用enumerate进行索引
确定,现在使用enumerate;)谢谢您的时间:)