2013-06-25 3 views
3

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

================================================================== 
###Pseudo-code -- I apologize if this does not follow existing conventions 
main_function() 
    if do_stuff_function is not running: 
     Thread1 = new thread running do_stuff_function 

do_stuff_function(args) 
    do some stuff 
    wait for 60 seconds (possibly using time.sleep()) 
    end thread (tell main_function that the thread is done) 
================================================================== 
###Abridged code 
def main(self): 
     check = True 
     index = 0 
     While index < 5: 
      if check == True: 
       check = False 
       thread1 = threading.Thread(target=self.doStuff, args=(self, index)) 



def do_stuff(self, index): 
    ###Stuff happens here#### 

    ###iterate index and somehow return it (possibly a global variable) 
    time.sleep(60) 
    ###somehow end the thread (still not entirely sure how to do that) 

=================================================================== 

Примечания:

- Этот инструмент имеет графический интерфейс, и все это, как правило, запереть и заморозить, если я запустить time.sleep() в основной цикл, поэтому я решил, что многопоточность будет хорошим решением (не стесняйтесь исправлять меня, если это неправильно). Или, возможно, другой способ подождать, чтобы не замерзать весь поток во время ожидания.

- Программа зависает в цикле while, есть ли способ сделать эту проверку без необходимости петли, возможно, что-то вроде обратного вызова (например, имитированная кнопка нажимает, когда заканчивается функция do_stuff())?

- Я также пытаюсь добавить к нему некоторую проверку ошибок, поэтому на основе результатов do_stuff() возвращаются разные коды ошибок (что-то, что нужно иметь в виду).

Прошу прощения, если этого недостаточно. не стесняйтесь спрашивать более подробную информацию, если вам это нужно. На самом деле, ребята, я ценю всю помощь, которую я могу получить, я просто пытаюсь получить четкое представление об этом! Благодаря!

+0

Используйте незанятое событие. –

+0

Нити не ускоряют что-либо в вашем коде, наоборот, они замедляют его. – michaelmeyer

+0

Чтобы создать комментарий к @ doukremt, найдите глобальную блокировку интерпретатора python (GIL), вот [статья] (http://eli.thegreenplace.net/2012/01/16/python-parallelizing-cpu-bound-tasks- с-multiprocessing /), которые помогли мне. – John

ответ

2

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

Еще одна проблема с потоками заключается в том, что они «запираются» из-за блокировки Global Interpreter Lock, потому что только один поток разрешен для записи в память в любой момент времени, абсурдный результат что многие потоки сбивают вашу программу, потому что все они ждут доступа к памяти.

+0

Благодарим за помощь! Я чувствую, что модуль многопроцессорности больше того, что я хотел. Число процессов зависит от количества ядер процессора? если это так, то как вы определяете количество ядер, которые имеет компьютер (чтобы инструмент мог адаптироваться к нескольким конфигурациям компьютера)? – TheBeardedBerry

+0

@TheBeardedBerry multiprocessing.cpu_count() выполнит трюк: [link] (http://stackoverflow.com/questions/1006289/how-to-find-out-the-number-of-cpus-in-python) – jcr

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