X Tutup
Skip to content

Commit 19e7b2c

Browse files
committed
add new
1 parent 12d1bb3 commit 19e7b2c

File tree

4 files changed

+87
-4
lines changed

4 files changed

+87
-4
lines changed

19-concurrency/spinner_thread.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,17 @@
1212
def spin(msg: str, done: Event) -> None: # <1>
1313
for char in itertools.cycle(r'\|/-'): # <2>
1414
status = f'\r{char} {msg}' # <3>
15-
print(status, end='', flush=True)
16-
if done.wait(.1): # <4>
15+
print(status,
16+
end='',
17+
flush=True
18+
)
19+
if done.wait(.5): # <4>
1720
break # <5>
1821
blanks = ' ' * len(status)
1922
print(f'\r{blanks}\r', end='') # <6>
2023

2124
def slow() -> int:
25+
# print("sleep for 3 seconds")
2226
time.sleep(3) # <7>
2327
return 42
2428
# end::SPINNER_THREAD_TOP[]

20-executors/demo_executor_map.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ def loiter(n): # <2>
2020
def main():
2121
display('Script starting.')
2222
executor = futures.ThreadPoolExecutor(max_workers=3) # <4>
23-
results = executor.map(loiter, range(5)) # <5>
23+
results = executor.map(loiter, range(5, 0, -1)) # <5>
2424
display('results:', results) # <6>
2525
display('Waiting for individual results:')
26-
for i, result in enumerate(results): # <7>
26+
for i, result in enumerate(results,1): # <7>
2727
display(f'result {i}: {result}')
2828

2929
if __name__ == '__main__':

20-executors/primes/proc_pool1.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
2+
import sys
3+
from concurrent import futures
4+
from time import perf_counter
5+
from typing import NamedTuple
6+
7+
from primes import is_prime, NUMBERS
8+
9+
10+
class PrimeResult(NamedTuple):
11+
n: int
12+
flag: bool
13+
elapsed: float
14+
15+
16+
def check(n: int) -> PrimeResult:
17+
t0 = perf_counter()
18+
res = is_prime(n)
19+
return PrimeResult(n, res, perf_counter()-t0)
20+
21+
22+
def main() -> None:
23+
if len(sys.argv) < 2:
24+
workers = None
25+
else:
26+
workers = int(sys.argv[1])
27+
28+
executor = futures.ProcessPoolExecutor(max_workers=workers)
29+
actual_workers = executor._max_workers
30+
31+
print(f'Checking{len(NUMBERS)} numbers with {actual_workers} processes:')
32+
33+
t0 = perf_counter()
34+
numbers = sorted(NUMBERS, reverse=True)
35+
with executor:
36+
for n, prime, elapsed in executor.map(check, numbers):
37+
label = 'P' if prime else ' '
38+
print(f'{n: 16} {label} {elapsed:9.6f}s')
39+
time = perf_counter() - t0
40+
print(f'Total time: {time:.2f}s')
41+
42+
43+
if __name__ == '__main__':
44+
main()
45+
46+
47+
48+
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import asyncio
2+
import socket
3+
4+
from keyword import kwlist
5+
6+
MAX_KEYWORD_LEN = 4
7+
8+
9+
async def probe(domain: str) -> tuple[str: bool]:
10+
loop = asyncio.get_running_loop()
11+
try:
12+
await loop.getaddrinfo(domain, None)
13+
except socket.gaierror:
14+
return (domain, False)
15+
return (domain, True)
16+
17+
18+
async def main() -> None:
19+
names = (kw for kw in kwlist if len(kw) <= MAX_KEYWORD_LEN)
20+
domains = (f"{name}.dev".lower() for name in names)
21+
coros = [probe(domain) for domain in domains]
22+
# for coro in coros:
23+
for coro in asyncio.as_completed(coros):
24+
domain, found = await coro
25+
mark = "+" if found else " "
26+
print(f"{mark} {domain}")
27+
28+
29+
if __name__ == "__main__":
30+
asyncio.run(main())
31+

0 commit comments

Comments
 (0)
X Tutup