我想在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,我怎么能用全部
答案 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操作中(这些操作本身就是顺序)。