0

我想在 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核心匹配在一起?我想用我的电脑最快的速度写文件,我使用 i7 cpu,我怎么能全部使用

4

1 回答 1

2

您需要一个锁定机制:http ://en.wikipedia.org/wiki/Lock_%28computer_science%29 和参考(min, max),而不是本地副本。多处理库已经有一个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 的功能,算法的性能瓶颈位于 I/O 操作(本质上是顺序的)。

于 2013-12-20T13:40:17.343 回答