Многопоточность Python наследуется от класса Thread

Python

Эта статья была впервые опубликована вЗнай почти

Предыдущая статьяСпособ реализации многопоточности

  • создать функцию
  • использоватьThreadФункция создает процесс и передает ему функцию для запуска

В этой статье мы говорим о другом способе реализации многопоточности — от класса threading наследуется новый класс.Thread, который в основном реализует__init__а такжеrunметод

один

Сначала рассмотрим простейший пример, реализующий толькоrunметод

import time
import threading
class MyThread(threading.Thread):
def run(self):
time.sleep(1)
a = 1 + 1
print(a)
for _ in range(5):
th = MyThread()
th.start()

В заключение

  • определить класс, наследоватьthreading.Threadкласс, который нужно только определитьrunметод
  • runМетод эквивалентен ранее переданному вThreadОбратите внимание, что функцию можно использовать толькоrunЭто имя без явного вызова threadstart()автоматически вызывается, когдаrun
  • Нет необходимости передавать параметры при создании экземпляра класса, а результат можно вызватьstart joinи т.д. метод
  • упоминалось в предыдущей статьеThreadобъект может вызыватьstart join runи другие методы, собственно, при вызовеstartавтоматически вызываетсяrun. Это просто переопределено в новом классеrunметод, вызов потокаstartавтоматически выполнит этоrun

два

Каждый раз, когда выполняется вышеуказанноеrunОни все одинаковые Они редко используются таким образом Иногда необходимо передать некоторые отличительные параметры, что требует определения класса__init__Что ж, давайте посмотрим на следующий пример

import threading
import requests
from bs4 import BeautifulSoup
class MyThread(threading.Thread):
def __init__(self, i):
threading.Thread.__init__(self)
self.i = i
def run(self):
url = 'https://movie.douban.com/top250?start={}&filter='.format(self.i*25)
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
lis = soup.find('ol', class_='grid_view').find_all('li')
for li in lis:
title = li.find('span', class_="title").text
print(title)
for i in range(10):
th = MyThread(i)
th.start()

Приведенный выше код реализует 10 потоков для захвата названий фильмов с 10 страниц веб-сайта Douban top250 через__init__Передать информацию о цикле в класс.

три

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

  • Threadпараметры функции. Передайте некоторые параметры при инициализации потока, здесь вы также можете__init__определено в
  • Threadметоды объекта. можно использовать здесьselfвызывать эти методы напрямую
  • threading.activeCount()и т.д. переменные, которые вызываются напрямую. Вы все еще можете позвонить сюда

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

import time
import threading
class MyThread(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
a = 1 + 1
print(threading.currentThread().name)
time.sleep(1)
print(self.name)
time.sleep(1)
print(self.is_alive())
t = time.time()
ths = [MyThread('thread {}'.format(i)) for i in range(3)]
for th in ths:
th.start()
print(threading.activeCount())
for th in ths:
th.join()
print(time.time() - t)

Результат возврата следующий

thread 0
thread 1
thread 2
4
thread 0
thread 2
thread 1
True
True
True
2.0039498805999756

Четыре

На самом деле существует еще одна форма использования наследования классов.

используется напрямуюrunОпределите функцию расчета. Если функция расчета уже есть, ее также можно передать, а не переписывать какrun

import threading
import requests
from bs4 import BeautifulSoup
def gettitle(page):
url = 'https://movie.douban.com/top250?start={}&filter='.format(page*25)
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
lis = soup.find('ol', class_='grid_view').find_all('li')
for li in lis:
title = li.find('span', class_="title").text
print(title)
class MyThread(threading.Thread):
def __init__(self, target, **args):
threading.Thread.__init__(self)
self.target = target
self.args = args
def run(self):
self.target(**self.args)
for i in range(10):
th = MyThread(gettitle, page = i)
th.start()

Добро пожаловать, чтобы обратить внимание на мою колонку знаний

Главная страница колонки:программирование на питоне

Каталог столбцов:содержание

Примечания к выпуску:Примечания к выпуску программного обеспечения и пакетов