Эта статья была впервые опубликована вЗнай почти
Предыдущая статьяСпособ реализации многопоточности
- создать функцию
- использовать
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()
Добро пожаловать, чтобы обратить внимание на мою колонку знаний
Главная страница колонки:программирование на питоне
Каталог столбцов:содержание
Примечания к выпуску:Примечания к выпуску программного обеспечения и пакетов