2013-10-27 5 views
5

Я новичок в многопоточной обработке, поэтому, пожалуйста, простите меня, если я меняю условия или пропущу что-то очевидное.Нити Python не запускаются одновременно

Код, приведенный ниже, не предлагает каких-либо преимуществ по сравнению с другим кодом, который вызывает одни и те же функции один за другим.


import time 
import threading 

start_time = time.clock() 

def fibonacci(nth): #can be ignored 
    first = 0 
    second = 1 
    for i in range(nth): 
     third = first + second 
     first = second 
     second = third 
    print "Fibonacci number", i + 1, "is", len(str(first)), "digits long" 

def collatz(collatz_max): #can be ignored 
    for n in range(collatz_max): 
     n = n + 1 #avoid entering 0 
     solution = [] 
     solution.append(n) 
     while n != 1: 
      if n % 2 == 0: 
       n = n/2 
      else: 
       n = (n*3) + 1 
      solution.append(n) 
    print "Path for Collatz number", collatz_max, "is", solution 

def scripts(): 
    thread_fibonacci = threading.Thread(target=fibonacci, args = (800000,)) 
    thread_collatz = threading.Thread(target=collatz, args = (400000,)) 

    thread_fibonacci.start() 
    thread_collatz.start() 

    return thread_fibonacci, thread_collatz 

all_scripts = scripts() 

#wait until both threads are finished 
for script in all_scripts: 
    script.join() 

print time.clock() - start_time, "seconds" 

Что мне нужно сделать, чтобы нити одновременными? Может ли GIL означать, что параллелизм может быть достигнут только через отдельные процессы? Если да, то в чем смысл многопоточности?

Использование Python 2.7.5 на Windows 8.1, четырехъядерный процессор. Любая помощь будет оценена по достоинству.

+2

Вы можете проверить этот ответ: http://stackoverflow.com/a/1294402/58129 –

+7

Используйте 'multiprocessing' вместо' threading', чтобы обойти ограничение GIL. – Blender

+0

Что сказал Блендер. См. Этот вопрос для получения дополнительной информации/примеров - http://stackoverflow.com/questions/17424569/python-threading-vs-multiprocessing-in-linux – DreadPirateShawn

ответ

7

Есть хорошие ответы, касающиеся GIL, на которые вы можете посмотреть.

Короче говоря, если ваши задачи связаны с процессором (например, те, что вы отправили), потоки не помогут вам. Потоки Python хороши для задач с привязкой к IO, например, для получения веб-страницы.

+0

Спасибо, Rho! Я бы поддержал ваш комментарий, но мне не хватает репутации. Почему задачи, связанные с CPU, не могут выполняться одновременно? Думая о играх, не большинство задач связано с ЦП? (например, что-то похожее на экран) –

+1

Вы можете иметь параллелизм в python. Подробное объяснение см. Здесь: http://jessenoller.com/blog/2009/02/01/python-threads-and-the-global-interpreter -lock Например, подумайте, что цикл (событие), который выполняет бит задачи в первом цикле и бит другой задачи в следующем цикле и так далее. И посмотрите этот клон minecraft https://github.com/fogleman/Minecraft/blob/master/main.py#L409 – Rolando

+0

Отличная информация; Я буду изучать все это в глубину. Без GIL мой код будет работать одновременно? Могут ли другие языки параллельно выполнять связанные с процессором потоки? –

Смежные вопросы