Учебный каталог Python
- Использование Python3 под Mac
- Типы данных для изучения Python
- Функция обучения Python
- Расширенные возможности обучения Python
- Функциональное программирование для изучения Python
- Модуль обучения Python
- Объектно-ориентированное программирование для изучения Python
- Расширенное объектно-ориентированное программирование для изучения Python
- Отладка ошибок и тестирование обучения Python
- Программирование ввода-вывода для изучения Python
- Процесс обучения Python и поток
- Регулярность изучения Python
- Общие модули для изучения Python
- 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 неfork
call, приведенный выше код не будет работать в Windows. Поскольку система Mac основана на ядре BSD (разновидность Unix), запуск под Mac не проблема.Рекомендуется использовать Mac для изучения Python!
multiprocessing
Если вы планируете написать многопроцессорную сервисную программу, Unix/Linux, несомненно, будет правильным выбором. Поскольку Windows неfork
Звоните, а на винде нельзя писать многопроцессорные программы на Python?
Поскольку Python является кроссплатформенным, он, естественно, должен обеспечивать кроссплатформенную поддержку нескольких процессов.multiprocessing
Модуль — это кроссплатформенная версия многопроцессорного модуля.
multiprocessing
модуль обеспечиваетProcess
class для представления объекта процесса, следующий пример демонстрирует запуск дочернего процесса и ожидание его завершения:
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-запроса, идентификационной информации пользователя и т. д. для каждого потока, чтобы все вызываемые функции обработки потока могли легко получить доступ к этим ресурсам.