Resumo : neste tutorial, você aprenderá como estender a Thread
classe Python para executar código em um novo thread.
Introdução à classe Python Thread
Quando um programa Python é iniciado, ele possui um thread chamado thread principal . Às vezes, você deseja descarregar as tarefas vinculadas a E/S para um novo thread para executá-las simultaneamente. Para fazer isso, você usa o módulo de threading integrado .
Uma maneira de executar código em um novo thread é estender a Thread
classe do threading
módulo. Aqui estão as etapas:
- Primeiro, defina uma subclasse de
threading.Thread
classe. - Segundo, substitua
__init__(self, [,args])
o método dentro do__init__()
método da subclasse para adicionar argumentos personalizados. - Terceiro, substitua o
run(self, [,args])
método dentro da subclasse para personalizar o comportamento da nova classe de thread quando um novo thread for criado.
Vejamos um exemplo de extensão da Thread
classe. Desenvolveremos uma classe que executa uma solicitação HTTP para uma URL e exibe o código de resposta:
class HttpRequestThread(Thread):
def __init__(self, url: str) -> None:
super().__init__()
self.url = url
def run(self) -> None:
print(f'Checking {self.url} ...')
try:
response = urllib.request.urlopen(self.url)
print(response.code)
except urllib.error.HTTPError as e:
print(e.code)
except urllib.error.URLError as e:
print(e.reason)
Linguagem de código: Python ( python )
Como funciona.
Primeiro, defina um HttpRequestThread
que estenda a Thread
classe do threading
módulo:
class HttpRequestThread(Thread):
Linguagem de código: Python ( python )
Segundo, defina o
método que aceita uma URL. Dentro do __init__()
método chama o __init__()
método da superclasse.__init__()
def __init__(self, url: str) -> None:
super().__init__()
self.url = url
Linguagem de código: Python ( python )
Terceiro, substitua o método run que usa urllib
para obter o código de status HTTP do URL especificado e exibi-lo no console:
def run(self) -> None:
print(f'Checking {self.url} ...')
try:
response = urllib.request.urlopen(self.url)
print(response.code)
except urllib.error.HTTPError as e:
print(e.code)
except urllib.error.URLError as e:
print(e.reason)
Linguagem de código: Python ( python )
Para usar a
classe, você cria instâncias da HttpRequestThread
classe e chama o HttpRequestThread
start()
método. Além disso, você pode chamar o join()
método para aguardar a conclusão de todos os threads.
O seguinte define a main()
função que usa a HttpRequestThread
classe:
def main() -> None:
urls = [
'https://httpstat.us/200',
'https://httpstat.us/400'
]
threads = [HttpRequestThread(url) for url in urls]
[t.start() for t in threads]
[t.join() for t in threads]
Linguagem de código: Python ( python )
Como funciona.
Primeiro, defina uma lista de URLs que queremos verificar:
urls = [
'https://httpstat.us/200',
'https://httpstat.us/400'
]
Linguagem de código: Python ( python )
Em segundo lugar, crie instâncias com
base na HttpRequestThread
urls
lista usando compreensão de lista. A compreensão da lista retorna uma lista de instâncias da
classe:HttpRequestThread
threads = [HttpRequestThread(url) for url in urls]
Linguagem de código: Python ( python )
Terceiro, chame o start()
método de cada thread da threads
lista:
[t.start() for t in threads]
Linguagem de código: Python ( python )
Por fim, chame o join de cada Thread
instância para aguardar a threads
conclusão de tudo:
[t.join() for t in threads]
Linguagem de código: Python ( python )
Junte tudo:
from threading import Thread
import urllib.request
class HttpRequestThread(Thread):
def __init__(self, url: str) -> None:
super().__init__()
self.url = url
def run(self) -> None:
print(f'Checking {self.url} ...')
try:
response = urllib.request.urlopen(self.url)
print(response.code)
except urllib.error.HTTPError as e:
print(e.code)
except urllib.error.URLError as e:
print(e.reason)
def main() -> None:
urls = [
'https://httpstat.us/200',
'https://httpstat.us/400'
]
threads = [HttpRequestThread(url) for url in urls]
[t.start() for t in threads]
[t.join() for t in threads]
if __name__ == '__main__':
main()
Linguagem de código: Python ( python )
Saída:
Checking https://httpstat.us/200 ...
Checking https://httpstat.us/400 ...
200
400
Linguagem de código: JavaScript ( javascript )
Resumo
- Estenda a
Thread
classe para executar código em um novo thread chamando o__init__()
método da superclasse na subclasse e substitua o método run para adicionar o código para execução em um novo thread.