Использовать все ядро ​​​​процессора в скрипте Python для одного процесса

я хочу использовать весь процессор в скрипте Python, я нахожу такой же код:

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()

но это не соответствует процессору вместе. p1 начинает запись с 1,2,3,4,5 .... и p2 не продолжает p2 также начинает с начала 1,2,3,4, поэтому результат: 1122334455

как я могу соединить 2 ядра процессора вместе? я хочу записать файл с максимальной скоростью, мой компьютер может это сделать, я использую процессор i7, как я могу использовать все


person user2244393    schedule 20.12.2013    source источник
comment
Узким местом здесь вряд ли является процессор, скорее всего, вас упирает в скорость записи файлов. И обратите внимание, что запись файла не является потокобезопасной, вы получите искаженные данные без каких-либо блокировок.   -  person alko    schedule 20.12.2013
comment
я думаю, что этот поток работает так же, как код и имеет разные значения   -  person user2244393    schedule 20.12.2013


Ответы (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()

В любом случае, вы можете использовать мощность вашего процессора сколько угодно, узкое место производительности вашего алгоритма находится в операциях ввода-вывода (которые по своей сути являются последовательными).

person lucasg    schedule 20.12.2013
comment
Можете дать мне пример в скрипте Python: D? об этой науке о замках я новый питон, я не профессионал, спасибо - person user2244393; 20.12.2013
comment
вот и все, чувак :D теперь я тестирую свой процессор 5core ›:) еще раз спасибо - person user2244393; 20.12.2013