Исследование пришло к выводу (34%)

1. Пропустите

       1) Что нить

                  Операционная система резьбы является наименьшей единицей операций планирования, которые включены в процесс, поток является постоянный поток исполнения

2. Соотношение между потоками и процессами

         Тема не может существовать в одиночку, должны существовать в этом процессе, процесс представляет собой блок ресурсов, который содержит все ресурсы, необходимые для запуска программы, это реальный поток исполнительных блоков

    Нет темы, процессы, ресурсы не могут не использоваться, поэтому процесс, который содержит, по меньшей мере, один поток, называемый основной поток, когда мы начинаем программу, операционная система будет создавать основной поток для себя эту программу, нить программой может быть поздно, открыть свой собственный поток называется дочерний поток

3. Зачем вам нужен поток

               Только одна цель состоит в том, чтобы повысить эффективность

4. многопоточного использование

              1) Способ использования модуля

               2) класс резьбы наследование, затем переопределить запуска () метод

от резьба импорта темы, current_thread 
времени импорта 

четкости задачи (): 
    печати ( "2", current_thread ()) 
    печать ( "子进程работает") 
    time.sleep (10) 
    печати ( "子进程") , 

если __name__ == «__main__ «: 
    т = Thread (целевая задача =) 
    t.start () 
    печать ( "主线程") 
    печать ( "1", current_thread ()) 

класс MyThread (Thread): 
    защиту работать (самостоятельно): 
          печать ("子进程тун ") 
т = MyThread () для 
печати ("父进程")

 

5. Элементы темы

       1) Создать небольшие накладные расходы

       2) несколько потоков в одних и тех же данных процесса могут быть разделены

       Между 3) многопоточный, равно отношения, нет отношения родитель-ребенок, PID все нити одинаковы

  

#创建线程开销对比
импорт ОС 
из резьб импорта тему 
из многопроцессорных импорта процесса 

время импорта 


задачу четкости (): 
    # печать ( "привет") 
    печать (os.getpid ()) 
    пройти , 

если __name__ == '__main__': 

    st_time = время. (время) 

    Ts = [] 
    для г в диапазоне (100): 
        т = резьбы (целевая задача =) 
        # T = Процесс (целевая задача =) 
        t.start () 
        ts.append (т) 

    при т в Ts: 
        т. присоединиться () 

    печать (time.time () - st_time) 
    печать ( "主над")

  

6. демон нить

           Вы можете установить нить как демон нить в другой поток

          Особенности: после того, как конец нити нить охранник демон также подходит к концу

от резьба импорта темы 
импорта времени 

четкости задачи (): 
    печать ( "子1running ......") 
    time.sleep (100) 
    печати ( "子1over ......") 

Защита task2 (): 
    печати ( "子2running ......") 
    time.sleep (4) 
    печать ( "子2over ......") 
    
т = Thread (целевая задача =) 
t.daemon = True 
t.start () 

t2 = Thread (цель = task2) 
t2.start () 

печать ( "主над")

  

мьютекс 7. Thread

      Совместное использование означает конкуренцию

       Потоки также вопросы безопасности,

       Несколько потоков могут выполняться одновременно, и один раз с одновременным доступом к тем же ресурсам, что будет проблема

       Решение: по-прежнему мьютекс

от резьба импорта темы, перечисление, блокировки 
времени импорта 

числа = 10 

блокировки = Блокировка () 

четкость задачи (): 
    глобальный номер 
    lock.acquire () 
    а = число 
    time.sleep (0,1) 
    число = а - 1 
    lock.release () 

для я в диапазоне (10): 
    т = нить (целевая задача =) 
    t.start () 

для т в Перечислим () [1]: 
    # печать (т) 
    t.join () для 
    
печати (номер)

8. тупиковой

Многопоточность Блокировка Импорт из, current_thread, Нить 

«» " 
    тупик , 
    когда программа там было больше , чем замок, которые проводятся с помощью другого потока, то ресурс должен обладать, чтобы использовать два замка на 
    этот раз программа будет обрабатывать неограниченное застревает состояние, которое называется тупиковым 
    пример: 
        есть тарелки и палочки для еды , но должна быть лицо , занимающими палочкам другого человек , держа палочки блюда блюда , такие как , 
    
    как избежать тупиковых   
        блокировок не более чем адекватный , 
        если проблема тупиковая имеет место, партия должна быть вынуждена сдать замок 
        
"" " 
Импорт Time 
# пластины 
Lock1 = замок () 

# палочки 
Lock2 = блокировка () 

DEF eat1 (): 
    lock1.acquire () 
    Print (" S грейфер% к пластине "% current_thread () имя). 
    time.sleep (0,5) 
    lock2.acquire () 
    Print (" % S палочками захватить "current_thread% () имя). 

    Print (" % S начал есть! «% current_thread ( ) .name)имя) 
    lock2.release ()
    печать ( "% s положил палочки для еды" % current_thread () имя.) 

    lock1.release () 
    печать ( "% S вниз пластина" % current_thread () имя.) 


DEF eat2 (): 
    lock2.acquire () 
    печать ( «% S захватить палочками "% current_thread () имя.) 

    lock1.acquire () 
    Print (" % S , чтобы захватить пластины "% current_thread () имя). 


    Print (" % S открыт , чтобы поесть! «% current_thread (). название) 


    lock1 .release () 
    Печать ( "% S вниз пластины" % current_thread () имя.) 
    lock2.release () для 
    печати ( "% S подавлены палочки" current_thread% (). название) 


T1 = нить (мишень = eat1) 


Т2 = нить (цель = eat2) 

t1.start () 
t2.start ()

  

Замок 9. возвратный

       RLOCK называется возвратным или рекурсивный замок блокировки

      RLOCK не используется для решения проблемы взаимоблокировки

           Единственное различие с фиксацией: замок R в том же потоке может выполнять приобрести несколько раз , но исполнение должно получить соответствующий релиз несколько раз , если поток

          Была выполнена ACQUIRE, приобретают другие потоки не будут выполнены

от резьба импорта RLOCK, Lock, Thread 

# л = Блокировка () 
# 
# l.acquire () 
# печати ( "1") 
# l.acquire () 
# печати ( "2") 


л = RLOCK () 

# l.acquire () 
# печать ( "1") 
# l.acquire () 
# печать ( "2") 

Защита задача (): 
    l.acquire () 
    печать ( "子пробег ......") 
    l.release () 


#主线程锁了一次
l.acquire () 
l.acquire () 

l.release () 
l.release () 
t1 = нить (целевая задача =) 
t1.start ()

  

10. семафор

«» " 
 Семафор знать 
замок RLOCK 

теперь может быть заблокирован , а код может быть сколько потоков одновременно доступ 
замка блокировки туалета в то же время только один 
Семафор , чтобы заблокировать общественный туалет , в то же время может быть кучей людей 


использовать: Только для управления параллелизмом доступ одновременно модификация не избежать проблем , вызванных 
"" " 

от Threading импорта семафор, Thread 
Импорт времени 

S = Семафор (5) . 
DEF Task (): 
    s.acquire () 
    Print (" суб-RUN «) 
    (. 3) time.sleep 
    печати ( "суб-над") 
    s.release () 

для ввода в диапазоне (10): 
    Т = Нить (целевой = целевой) 
    t.start ()

  

 

рекомендация

отwww.cnblogs.com/xzcvblogs/p/10974580.html