在python脚本中使用所有cpu核心进行一个进程

时间:2013-12-20 13:35:44

标签: python python-2.7 multiprocessing cpu-usage multiprocess

我想在python脚本中使用所有cpu 我发现一些相同的代码:

def do_sum():
    min = 0
    max = 100000000
    while min < max:
        min += 1
        file = open('mytext.txt','a')
        file.write(str(min))
def main():
    q = Queue()
    p1 = Process(target=do_sum)
    p2 = Process(target=do_sum)
    p1.start()
    p2.start()
    r1 = q.get()
    r2 = q.get()
    print r1+r2

if __name__=='__main__':
    main()

但它与cpu不匹配 p1从1,2,3,4,5开始写.... 并且p2不继续p2也从开始1,2,3,4开始 结果是:1122334455

我如何将2核心的cpu匹配在一起? 我想用最快的PC写文件可以做到,我使用i7 cpu,我怎么能用全部

1 个答案:

答案 0 :(得分:1)

您需要一个锁定机制:http://en.wikipedia.org/wiki/Lock_%28computer_science%29(min, max)的引用,而不是本地副本。 多处理lib已经有一个Lock()对象可以避免覆盖,而Value()对象可以在多个进程之间共享一个共同状态。

from multiprocessing import Queue, Process, Lock,Value

def do_sum(id, counter, lock):
    MAX = 50
    while counter.value < MAX:    

        lock.acquire()
        counter.value += 1

        file = open('mytext.txt','a')
        file.write(str(counter.value))
        file.write("\n")
        file.close()

        lock.release()


def main():

    counter = Value('d', 0.0)
    lock = Lock()

    #f = open('mytext.txt','w')
    #f.close()
    print 'atat'
    q = Queue()
    p1 = Process(target=do_sum, args=(0, counter, lock,) )
    p2 = Process(target=do_sum, args=(1,counter, lock,) )
    p1.start()
    p2.start()
    r1 = q.get()
    r2 = q.get()
    print r1+r2

if __name__=='__main__':
    main()

无论如何,你可以随心所欲地利用cpu的强大功能,你的算法的perfs瓶颈位于I / O操作中(这些操作本身就是顺序)。