You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: online/cap15.adoc
+4-4Lines changed: 4 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -840,7 +840,7 @@ implementação mais simples, produzindo strings diretamente, sem passar pelo
840
840
seria necessário.]
841
841
842
842
Aqui está outro exemplo com `cast`, desta vez para corrigir uma dica de tipo
843
-
desatualizada na biblioteca padrão de Python. No <<tcp_mojifinder_main_ex>>, criei
843
+
desatualizada na biblioteca padrão de Python. No <<ex_tcp_mojifinder_main>>, criei
844
844
um objeto `asyncio.Server`, e queria obter o endereço onde o servidor está
845
845
ouvindo (aceitando conexões). Escrevi esta linha de código:
846
846
@@ -892,7 +892,7 @@ seguro.
892
892
A leitora atenta pode ter notado que `sockets[0]` poderia gerar um `IndexError`
893
893
se `sockets` estiver vazio.
894
894
Entretanto, até onde entendo o `asyncio`, isso não pode acontecer no
895
-
<<tcp_mojifinder_main_ex>>, pois no momento em que leio o atributo `sockets`, o
895
+
<<ex_tcp_mojifinder_main>>, pois no momento em que leio o atributo `sockets`, o
896
896
`server` já está pronto para aceitar conexões , portanto o atributo não estará
897
897
vazio. E, de qualquer forma, `IndexError` ocorre durante a execução. O Mypy não
898
898
consegue localizar esse problema nem mesmo em um caso trivial como
@@ -1161,7 +1161,7 @@ Dada a instabilidade da situação atual, se você precisar ler anotações dura
1161
1161
pass:[<code>in​spect​.get_annotations</code>] ou `typing.get_type_hints`, e faça o restante de sua base de código chamar aquela função, de forma que mudanças futuras fiquem restritas a um único local.
1162
1162
1163
1163
Para demonstrar esse segundo ponto, aqui estão as primeiras linhas da classe `Checked`, definida no
1164
-
<<checked_class_top_ex>>, classe que estudaremos no <<ch_class_metaprog>>:
1164
+
<<ex_checked_class_top>>, classe que estudaremos no <<ch_class_metaprog>>:
1165
1165
1166
1166
[source, python]
1167
1167
----
@@ -1900,7 +1900,7 @@ https://fpy.li/15-52[docstring] no código-fonte.
1900
1900
1901
1901
1902
1902
Caí em uma toca de coelho similar quando acrescentei dicas de tipo ao
1903
-
<<primes_procs_top_ex>>, uma demonstração simples de `multiprocessing`.
1903
+
<<ex_primes_procs_top>>, uma demonstração simples de `multiprocessing`.
Copy file name to clipboardExpand all lines: online/cap19.adoc
+6-6Lines changed: 6 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -804,16 +804,16 @@ Quando((("process pools", "code for multicore prime checker", id="PPmulticore19"
804
804
Em vez disso, a função de trabalho é guiada pela biblioteca de threads ou processos, e por fim produz um resultado que precisa ser armazenado em algum lugar.
805
805
Coordenar threads ou processos de trabalho e coletar resultados são usos comuns de filas em programação concorrente—e também em sistemas distribuídos.
806
806
807
-
Muito do código novo em _procs.py_ se refere a configurar e usar filas. O início do arquivo está no <<primes_procs_top_ex>>.
807
+
Muito do código novo em _procs.py_ se refere a configurar e usar filas. O início do arquivo está no <<ex_primes_procs_top>>.
808
808
809
809
[WARNING]
810
810
====
811
811
`SimpleQueue` foi acrescentada a `multiprocessing` no Python 3.9.
812
812
Se você estiver usando uma versão anterior de Python,
813
-
pode substituir `SimpleQueue` por `Queue` no <<primes_procs_top_ex>>.
813
+
pode substituir `SimpleQueue` por `Queue` no <<ex_primes_procs_top>>.
814
814
====
815
815
816
-
[[primes_procs_top_ex]]
816
+
[[ex_primes_procs_top]]
817
817
.procs.py: checagem de primos com múltiplos processos; importações, tipos, e funções
818
818
====
819
819
[source, python]
@@ -842,7 +842,7 @@ Temos que chamar essa `SimpleQueue` para criar uma fila. Por outro lado, não po
842
842
.Loops, sentinelas e pílulas venenosas
843
843
****
844
844
A((("concurrency models", "indefinite loops and sentinels")))((("indefinite loops")))((("sentinels")))
845
-
função `worker` no <<primes_procs_top_ex>> segue um modelo comum em programação concorrente:
845
+
função `worker` no <<ex_primes_procs_top>> segue um modelo comum em programação concorrente:
846
846
percorrer indefinidamente um loop, pegando itens em um fila e processando cada um deles com uma função que realiza o trabalho real.
847
847
O loop termina quando a fila produz um valor sentinela.
848
848
Nesse modelo, a sentinela que encerra o processo é muitas vezes chamada de "pílula venenosa.
<1> Se nenhum argumento é dado na linha de comando, define o número de processos como o número de núcleos na CPU; caso contrário, cria quantos processos forem passados no primeiro argumento.
876
-
<2> `jobs` e `results` são as filas descritas no <<primes_procs_top_ex>>.
876
+
<2> `jobs` e `results` são as filas descritas no <<ex_primes_procs_top>>.
877
877
<3> Inicia `proc` processos para consumir `jobs` e informar `results`.
878
878
<4> Recupera e exibe os resultados; `report` está definido em pass:[<img src="callouts/6.png" alt="6"/>].
879
879
<5> Mostra quantos números foram checados e o tempo total decorrido.
@@ -1190,7 +1190,7 @@ Consumidores não precisam saber nada sobre os produtores (mas a requisição po
1190
1190
Pode-se adicionar mais unidades de execução para consumir tarefas a medida que a demanda cresce.
1191
1191
Por isso o _Celery_ e o _RQ_ são chamados de filas de tarefas distribuídas.
1192
1192
1193
-
Lembre-se que nosso simples _procs.py_ (<<primes_procs_top_ex>>) usava duas filas:
1193
+
Lembre-se que nosso simples _procs.py_ (<<ex_primes_procs_top>>) usava duas filas:
1194
1194
uma para requisições de tarefas, outra para coletar resultados.
1195
1195
A arquitetura distribuída do _Celery_ e do _RQ_ usa um esquema similar.
1196
1196
Ambos suportam o uso do banco de dados NoSQL https://fpy.li/19-50[_Redis_] para armazenar as filas de mensagens e resultados.
image::../images/flpy_2105.png[Captura de tela de conexão via telnet com tcp_mojifinder.py]
905
905
906
906
Este programa é duas vezes mais longo que o _web_mojifinder.py_, então dividi sua apresentação em três partes:
907
-
<<tcp_mojifinder_main_ex>>, <<tcp_mojifinder_top>>, e <<tcp_mojifinder_search>>.
907
+
<<ex_tcp_mojifinder_main>>, <<tcp_mojifinder_top>>, e <<tcp_mojifinder_search>>.
908
908
O início de _tcp_mojifinder.py_—incluindo os comandos `import`—está no <<tcp_mojifinder_top>>,mas vou começar descrevendo a corrotina `supervisor` e a função `main` que controla o programa.
909
909
910
-
[[tcp_mojifinder_main_ex]]
910
+
[[ex_tcp_mojifinder_main]]
911
911
.tcp_mojifinder.py: um servidor TCP simples; continua em <<tcp_mojifinder_top>>
912
912
====
913
913
[source, python]
@@ -964,7 +964,7 @@ Enquanto o loop de eventos estiver ativo, uma nova instância da corrotina `find
964
964
Agora vamos ver o início de _tcp_mojifinder.py_, com a corrotina `finder`.
965
965
966
966
[[tcp_mojifinder_top]]
967
-
.tcp_mojifinder.py: continuação de <<tcp_mojifinder_main_ex>>
967
+
.tcp_mojifinder.py: continuação de <<ex_tcp_mojifinder_main>>
0 commit comments