Процесс обучения Python и поток

искусственный интеллект Python Windows Mac

Учебный каталог Python

  1. Использование Python3 под Mac
  2. Типы данных для изучения Python
  3. Функция обучения Python
  4. Расширенные возможности обучения Python
  5. Функциональное программирование для изучения Python
  6. Модуль обучения Python
  7. Объектно-ориентированное программирование для изучения Python
  8. Расширенное объектно-ориентированное программирование для изучения Python
  9. Отладка ошибок и тестирование обучения Python
  10. Программирование ввода-вывода для изучения Python
  11. Процесс обучения Python и поток
  12. Регулярность изучения Python
  13. Общие модули для изучения Python
  14. Python обучение сетевому программированию

Для операционной системы задача — это процесс. Например, при открытии браузера запускается процесс браузера, при открытии блокнота запускается процесс блокнота, а при открытии двух блокнотов запускаются две заметки. Словесный процесс.

Некоторые процессы также выполняют несколько действий одновременно, например Word, который может выполнять набор текста, проверку орфографии, печать и т. д. одновременно. В процессе, если вы хотите делать несколько вещей одновременно, вам нужно одновременно запускать несколько «подзадач». Мы называем эти «подзадачи» в процессе потоками.

进程和线程

процесс

ПитонosМодули инкапсулируют общие системные вызовы, включаяfork, подпроцессы можно легко создать в программе Python:

import os

print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()
if pid == 0:
    print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
    print('I (%s) just created a child process (%s).' % (os.getpid(), pid))

Результаты приведены ниже:

Process (876) start...
I (876) just created a child process (877).
I am child process (877) and my parent is 876.

Поскольку Windows неforkcall, приведенный выше код не будет работать в Windows. Поскольку система Mac основана на ядре BSD (разновидность Unix), запуск под Mac не проблема.Рекомендуется использовать Mac для изучения Python!

multiprocessing

Если вы планируете написать многопроцессорную сервисную программу, Unix/Linux, несомненно, будет правильным выбором. Поскольку Windows неforkЗвоните, а на винде нельзя писать многопроцессорные программы на Python?

Поскольку Python является кроссплатформенным, он, естественно, должен обеспечивать кроссплатформенную поддержку нескольких процессов.multiprocessingМодуль — это кроссплатформенная версия многопроцессорного модуля.

multiprocessingмодуль обеспечиваетProcessclass для представления объекта процесса, следующий пример демонстрирует запуск дочернего процесса и ожидание его завершения:

from multiprocessing import Process
import os

# 子进程要执行的代码
def run_proc(name):
    print('Run child process %s (%s)...' % (name, os.getpid()))

if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    p = Process(target=run_proc, args=('test',))
    print('Child process will start.')
    p.start()
    p.join()
    print('Child process end.')

Результат выполнения следующий:

Parent process 928.
Process will start.
Run child process test (929)...
Process end.

При создании дочернего процесса вам нужно только передать функцию выполнения и параметры функции для созданияProcessнапример, сstart()метод запускается, так что процесс создается, чемfork()Еще проще.

join()Метод может дождаться завершения дочернего процесса, прежде чем продолжить работу, что обычно используется для синхронизации между процессами.

нить

Стандартная библиотека Python предоставляет два модуля:_threadиthreading,_threadмодуль низкого уровня,threadingэто расширенный модуль, да_threadв упаковке. В большинстве случаев нам нужно использовать толькоthreadingэтот расширенный модуль.

Чтобы запустить поток, нужно передать функцию и создатьThreadэкземпляр, а затем вызовитеstart()Начать выполнение:

import time, threading

# 新线程执行的代码:
def loop():
    print('thread %s is running...' % threading.current_thread().name)
    n = 0
    while n < 5:
        n = n + 1
        print('thread %s >>> %s' % (threading.current_thread().name, n))
        time.sleep(1)
    print('thread %s ended.' % threading.current_thread().name)

print('thread %s is running...' % threading.current_thread().name)
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print('thread %s ended.' % threading.current_thread().name)

Результат выполнения следующий:

thread MainThread is running...
thread LoopThread is running...
thread LoopThread >>> 1
thread LoopThread >>> 2
thread LoopThread >>> 3
thread LoopThread >>> 4
thread LoopThread >>> 5
thread LoopThread ended.
thread MainThread ended.

Lock

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

balance = 0
lock = threading.Lock()

def run_thread(n):
    for i in range(100000):
        # 先要获取锁:
        lock.acquire()
        try:
            # 放心地改吧:
            change_it(n)
        finally:
            # 改完了一定要释放锁:
            lock.release()

Когда несколько потоков выполняются одновременноlock.acquire(), только один поток может успешно получить блокировку, а затем продолжить выполнение кода, другие потоки продолжают ждать, пока блокировка не будет получена.

После того, как поток, получивший блокировку, израсходован, блокировку необходимо снять, иначе потоки, ожидающие блокировки, будут ждать вечно и станут мертвыми потоками. Поэтому мы используемtry...finallyчтобы убедиться, что замок будет разблокирован.

ThreadLocal

import threading

# 创建全局ThreadLocal对象:
local_school = threading.local()

def process_student():
    # 获取当前线程关联的student:
    std = local_school.student
    print('Hello, %s (in %s)' % (std, threading.current_thread().name))

def process_thread(name):
    # 绑定ThreadLocal的student:
    local_school.student = name
    process_student()

t1 = threading.Thread(target= process_thread, args=('Alice',), name='Thread-A')
t2 = threading.Thread(target= process_thread, args=('Bob',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()

Результаты:

Hello, Alice (in Thread-A)
Hello, Bob (in Thread-B)

глобальная переменнаяlocal_schoolтолько одинThreadLocalобъект, каждыйThreadможет читать и писать в негоstudentсвойства, но не влияют друг на друга. ты можешь поставитьlocal_schoolкак глобальная переменная, но каждое свойство, такое какlocal_school.studentВсе они являются локальными переменными потока, которые можно читать и записывать произвольно, не мешая друг другу, и нет необходимости решать проблему блокировки.ThreadLocalбудет обрабатываться внутри.

Можно понимать как глобальную переменнуюlocal_schoolЯвляетсяdict, можно не только использоватьlocal_school.student, вы также можете привязать другие переменные, такие какlocal_school.teacherи Т. Д.

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

Далее: Регулярность изучения Python