15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

print('Took %.3f seconds' % (end - start))

>>>

Took 0.503 seconds

O problema é que enquanto a função slow_systemcall estiver rodando, nosso

programa fica completamente parado, não pode continuar fazendo outra coisa. A

thread principal de execução do programa é bloqueada pela chamada de sistema

select. Em um caso real, essa situação é pavorosa! É preciso ser capaz de

computar o próximo movimento do helicóptero ao mesmo tempo em que o

comando anterior estiver sendo enviado, de outro modo ele pode bater em

alguma coisa ou cair. Sempre que se encontrar em alguma situação na qual seja

preciso executar paralelamente uma operação que bloqueia I/O e outra que

continua o fluxo do programa, considere embutir as chamadas de sistema em

threads.

No exemplo de código a seguir, rodo múltiplas chamadas à função

slow_systemcall em threads separadas. Isso permitiria, por exemplo, nos

comunicar com mais de uma porta serial (e mais de um helicóptero)

simultaneamente, ao mesmo tempo em que a thread principal do programa

poderia continuar fazendo quaisquer computações que fossem necessárias sem

interrupções.

start = time()

threads = []

for _ in range(5):

thread = Thread(target=slow_systemcall)

thread.start()

threads.append(thread)

Com as threads iniciadas, o código a seguir faz alguns cálculos para determinar a

próxima manobra do helicóptero sem esperar que as threads de chamada de

sistemas terminem.

def compute_helicopter_location(index):

# ...

for i in range(5):

compute_helicopter_location(i)

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!