2013-12-20 26 views
0

我想用所有CPU中的python腳本 我找到了一些代碼相同:用在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處理器,我怎麼能使用所有

+5

你在這裏的瓶頸幾乎不是cpu,很可能你受文件寫入速度的約束。並且請注意,文件寫入不是線程安全的,您會在沒有某種鎖的情況下得到數據錯亂的數據。 – alko

+0

可能與[Python:爲什麼不同的線程從一個生成器中獲取它們自己的一系列值?](可能與之相關)?(http://stackoverflow.com/questions/20042534/python-why-different-threads-get-their-own-series-從一個生成器) – alko

+0

我認爲這個線程工作相同,代碼和不同的值 – user2244393

回答

1

你需要鎖定機制: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所有你想要的perfs'你的算法的瓶頸位於I/O操作(其本身固有sequentials)的功率。

+0

可以讓我在Python腳本中的一個例子:D?關於這個鎖科學我是新的Python,我不親,謝謝 – user2244393

+0

我已經添加了一些代碼。 – lucasg

+0

這就是他的傢伙:D現在我測試使用我的CPU 5core> :)再次感謝 – user2244393

相關問題