ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 419
Obunachilar
Ma'lumot yo'q24 soatlar
+17 kunlar
-430 kunlar
Postlar arxiv
1 419
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
6.713048083242029
=== client_parallel_threads ===
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
11.749367957934737
=== client_parallel ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
7.422760541085154
ืืืคืชืขืื? ืื ืื ื ืืืคืชืขืชื ืงืฆืช. ืืืืืจ ืืจืืจ ืืื ืืืจืกื ืืจืืฉืื ื ืืืื ืืืืืช ืืื ืื ื ืืืื ืฉืืจืกืช ืืชืืืืืื ืื ืืื client ืืคืชืืขื ืืืืื ืืขืงืคื ืื ืืช ืืืจืกื ืืืกืื ืืจืื ืืช. ืื ืื ืืืืืง ืืขืื ืืืืจืฆื ืืืจืช ืงืืืืชื ืืช ืืชืืฆืื ืืื:
=== serial ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
24.061222000047565
=== client_serial ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
14.5340595417656
=== parallel ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
8.315202291123569
=== client_parallel_threads ===
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
7.089039749931544
=== client_parallel ===
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
5.17865683324635
ืกื ืืื ืื ืืกืื ืืืืื ืื ืฉืืืจ ืืืขื ื - ืฉืขืืืฃ ืืืืจืื ืงืืฆืื ืืืงืืื ืืืฉืจ ืืืืจ ืืื ืฉืืื ืืชืจืื ืืฉืืขืืชื ืืืจืฆื ืืกืื ืืจืื ืืช ืขื ืคื ื ืฉืืืืฉ ืืชืืืืืื ืื.
ืืขื ืืื ืื ืืฉืื ืื ืืชืงืืจื ืืฉืืืืฉ ืืงืื ืืกืื ืืจืื ื: ืื ืืจืฆื ืขื asyncio.run, ืื ืฉืืืืฉ ื asyncio.gather ืืฉืืื ืืืจืืฅ ืืืจืื ืืืงืืื ืืื ืื ืืคืฉืจ ืืื ืืืฉืชืืฉ ืืงืื ืืกืื ืืจืื ื ืืงืืื ืืฆืจืื ืืื ืืืชืื ืืืืฉ ืืช ืคืื ืงืฆืืืช ืืืืจืื. ืื ื ืืจืฆืชื ืขื ืคืืืชืื 3.14 ืืืจืฆืชื ืืื ืคืขืืื ืืชืืฆืืืช ืื ืืจืฆื ืืืืื ืงืฆืช ืฉืื ืืช ืืื ืืืืื ืช ืืฉืืืืช ืืืืจืืช ืืื ืืืืคืฆืืืช ืืชืืฆืื ืขืงืืืช.1 419
๐ ื ืืกืื httpx - ืืฉืืืื ืืื ืงืื ืืงืืืื, ืืืจื ืืืกืื ืืจืื ื
ืืืืืช httpx ืืคืืืชืื ืืื ืกืื ืฉื ืืืืจ ืืื ืฉื requests ืขื ืชืืขืื ืืืชืจ ืืขืืืื ืืชืืืื ืืืชืืื ืืกืื ืืจืื ืืช. ืืืื ื ืจืื ืืื ืื ืขืืื ืืจื ืชืืื ืืช ืงืฆืจื ืืื ื ืฉืืื ืืื ืื ืืื ืืจืกื ืืืจืืช, ืืงืืืืืช ืืืกืื ืืจืื ืืช.
ืืฉืืื ืืืืืื ืืงืืชื 4 ืกืคืจืื ืืคืจืืืงื ืืื ืืจื ืืื ืืชื 4 ืคืื ืงืฆืืืช ืฉืืืจืืืืช ืืช ืืจืืขืช ืืกืคืจืื, ืื ืืืช ืืืจื ืืืจืช. ืืงืื ืืชืืื ื import-ืื ืืืืืจืช ืจืฉืืืช ืืกืคืจืื:
import httpx
from timeit import timeit
from multiprocessing.dummy import Pool
import asyncio
book_urls = [
"https://www.gutenberg.org/cache/epub/84/pg84.txt",
"https://www.gutenberg.org/cache/epub/45304/pg45304.txt",
"https://www.gutenberg.org/cache/epub/2701/pg2701.txt",
"https://www.gutenberg.org/cache/epub/1342/pg1342.txt"
]
ืืคืื ืงืฆืื ืืจืืฉืื ื ืคืฉืื ืืคืขืืื get ืืจืืข ืคืขืืื ืืืช ืืืจื ืืฉื ืื:
def download_and_print_size(client, url):
r = client.get(url, timeout=60.0)
size = len(r.text)
print(f"Url: {url}; size: {size}")
def serial():
print("=== serial ===")
for url in book_urls:
download_and_print_size(httpx, url)
ื ืฉืื ืื ืฉ httpx ืืืืืจื timeout ืืจืืจืช ืืืื ืฉื 5 ืฉื ืืืช ืืขืืืจ ืคืจืืืงื ืืื ืืจื ืื ืื ืชืืื ืืกืคืืง ืื ืืืืืชื ืืืงื. ืืืืจืชื ืื ืคืื ืงืฆืืืช ืืืจืื ื ืคืจืืช ืืื ืืืกืื ืืคื ืงืื ืืืืืืืืช ืืืืืช.
ืคืื ืงืฆืื ืฉื ืื ืืืจ ืืฉืชืืฉืช ื client ืฉื httpx ืฉืื ืื ืื ืื ืฉืืื ืฉืฉืืืจ ืืช ืืืืืืจ ืืืชืจ ืคืชืื ืืื ืืืืจืื ืืกืคืจ ืงืืฆืื:
def client_serial():
print("=== client_serial ===")
with httpx.Client() as client:
try:
for url in book_urls:
download_and_print_size(client, url)
finally:
client.close()
ืืืจืกื ืืฉืืืฉืืช ืจืฆืืชื ืืจืืืช ืืื ืืกืืคืืจ ืืื ืืขืืื ืืืื ืชืืืืืื ืื ืืืงืืื ืื ืฉืืขืชื ืฉืืฉืืืจืืืื ืงืืืฅ ืืืงืืื ืืืื ืื ืืชืงืฆืจืื. ืคื ืืชืืชื ืฉืชื ืืจืกืืืช ืืืช ืขื client ืืืฉื ืื ืืื:
def parallel():
print("=== parallel ===")
with Pool(5) as p:
p.map(lambda url: download_and_print_size(httpx, url), book_urls)
def client_parallel_threads():
print("=== client_parallel_threads ===")
with httpx.Client() as client:
try:
with Pool(5) as p:
p.map(lambda url: download_and_print_size(client, url), book_urls)
finally:
client.close()
ืืืกืืื ืืืจืื ืืกืื ืืจืื ืืช. ืืื ืื ืจืืืชื ืืจื ืืื client ืื ืืืืจืชื ืืืชื ืืื ืืืื ืฉืืืืืจ ืืงืืืืื ื ืืกืื ืืจืื ื ืืืจ ืื ืืคืฉืจ ืืื ืืืฉืชืืฉ ืืืืชื ืคืื ืงืฆืืืช download ืฉืืืจ ืืชืืชื ืืืื ืื ืืชื ืืจืกื ืืกืื ืืจืื ืืช ืฉืื ืื:
async def download_and_print_size_async(client, url):
r = await client.get(url, timeout=60.0)
size = len(r.text)
print(f"Url: {url}; size: {size}")
async def client_parallel():
print("=== client_parallel ===")
async with httpx.AsyncClient() as client:
try:
await asyncio.gather(*[download_and_print_size_async(client, url) for url in book_urls])
finally:
await client.aclose()
ืืกืืื ืคืื ืงืฆืืืช main ืฉืืจืืฆื ืืช ืื ืืขืกืง ืืื ืืืืืช ืืื ืื:
def main():
print(timeit(lambda: serial(), number=1))
print(timeit(lambda: client_serial(), number=1))
print(timeit(lambda: parallel(), number=1))
print(timeit(lambda: client_parallel_threads(), number=1))
print(timeit(lambda: asyncio.run(client_parallel()), number=1))
if __name__ == "__main__":
main()
ืืื ืืชืืฆืืืช:
=== serial ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
32.953853541985154
=== client_serial ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 446583
Url: https://www.gutenberg.org/cache/epub/45304/pg45304.txt; size: 1356681
Url: https://www.gutenberg.org/cache/epub/2701/pg2701.txt; size: 1260594
Url: https://www.gutenberg.org/cache/epub/1342/pg1342.txt; size: 763083
12.404891041107476
=== parallel ===
Url: https://www.gutenberg.org/cache/epub/84/pg84.txt; size: 4465831 419
๐ ื ืืชื ืขื ืืื ืงืืื ืืืคืืก 4.6
ืืืงืฉืชื ืืงืืื ืงืื ืืชืงื ืืขืื ืืคื ื ืืื ืืืื ืืขื ืืขืช ืขืฆืื ืืื ืื ืขืฉื ืงืืืื ืืืืกืืฃ ืืืืืขืช ืืงืืืื ืืช ืืกืืืืช
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ืกื ืืื ืื ืืืื ืฉืื ืขืืฉืื ืืขืฆืื ืคืจืกืืืช ืืืจืืช ืฉืฆืจืื ืืืืื ืืช ืืืืช ืืืืื ืฉืขืฉื ืืช ืืชืืงืื ืืื ืืืงืื ืกืื ื ืืฉื qwen ืืื ืงืืื ืืืคืืก. ืคืชืืืช ืืืืขืช ืืงืืืื ืืืืืืื ืืจืื ืืฉืื "ืืืืจ ืืงืืืื" ืืช ืืฉื ืฉืื ืืฉื claude ืืืคืืื ืืช ืืชืืื ื ืฉื ืฉื ืื ื. ืืืืขืช ืืงืืืื ืขืฆืื ืืืื ืืกืืจ ืืืื ืฉืืื ืขื ืืคืืฆ'ืจ ืขื ืืืฉ ืขื "ืื ืืืฆืข" ืืื "ืืื ืืืฆืข", ืื ืฉืืืืจ ืฉืื ืฉืืืืข ืืืื ืืขืชืื ืืฆืืจื ืืงืจืื ืืจืื ืืงืกื ืืื ืืงืื ืืจืื ืชืืื ืืช.
ืื ืืขืืืื ืขื ืืื ืืืืจืืช ืขื ืืืืื ืืืืื ืืขืืืจ ืื ื ืืืืืข ืืชืืฆืืืช ืืืืืช ืืืชืจ ืืื ืืชืงื ืืขืืืืช ืฉื ืกืืื ื ืงืืืื ืืืขืืงืจ ืืืจืืืฉ ืคืืืช ืืืืืื ืืฉืกืืื ืงืืืื ืขืืฉื ืคืขืืื ืืฉืื ื. ืืื ืคืงืืืืช ืืื ืืื ืฉืืืืฉืืืช ืืขืื ืื ืืขืืืื ืขื ืกืืื ื ืงืืืื. ืื ืืืืจืื ืืืช ืืื? ืื ืชืชืืืืฉื ืืืงืฉ ื AI ืืืืื ืขืืืื ืืกืืจืื ืืืืืืืืช:
โ ืชืืงืื ืงืืืื
ืคืงืืืช git commit --amend ืืชืงื ืช ืืช ืืงืืืื ืืืืจืื ืืืืฆืขืืช ืืืกืคืช ืงืืฆืื ืื ืฉืื ืื ืืืืขืช ืืงืืืื. ืืชืืืื ืขืืืื ืจืืื ืฉืื ืขื ืกืืื ืงืืืื ืื ื ืืฉืชืืฉ ืืงืืืื ืชืืงืื ืืืจื ืื ืฉืื ืื ืงืื ืฉืืื ืขืืฉื ืืืืืจ ืืคื ื ืื ืืืืขื ื ืืกืคืช ืฉืื ื ืืืชื ืืกืืื. ืืฆืืจื ืืืืช ืื ืืืจื ืืืืืขื ืืกืืื ืืืืื ืืืจืืข ืืจืก ืืื ืืคืจืืืงื ืชืืื ืืคืฉืจ ืืืืืจ ืฆืขื ืืืืจื, ืื ืื ืืคืชืืจ ืืืืืื ื VS Code ืื ืงืจืกืจ ืื ืืืืืง ืขืืื.
โ ืจืืืืืก ืืื ืืจืงืืืื
ืื ืื ืฉืืจืชื ืืื ืงืืืืืื ืืฉื ืื ืื ืฉืืืื ืืืช ืื ืืชืืชื ืืืืขืืช ืงืืืื ืืกืคืืง ืืืืืช ืื ื ืืงืคืื ืืืคืขืื ืจืืืืืก ืืื ืืจืงืืืื ืืคื ื ืฉืืืฆืข push ืืื ืืชืงื ืืืืขืืช ืงืืืื ืืืืชื ืงืืืืืื ืืฉื ืื ืืืืืืง ืงืืืืื ืืื ืืื ืฉืื ืืืกืืคืื ืขืจื ืืคืจืืืงื. ืืืจื push ืื ื ืื ืืืื ืืฉื ืืช ืงืืืืืื ืืื ืืขืืืื ืฉืืืคืช ืื ื ืขืืฉื ืืจืื ืืืชืจ commit ื push.
โ ืคืชืืืช worktree
ืคืงืืืช git-worktree ืคืืชืืช ืขืืชืง ื ืืกืฃ ืฉื ืืงืืฆืื ืืคืจืืืงื ืืชืืงืืื ื ืคืจืืช, ืงืฆืช ืืื clone ืืื ืืื ืฉืฆืจืื ืืขืฉืืช push ื pull ืืื ืืกื ืืจื ืืืชื ืขื ืืขืืชืง ืืืจืืื ืฉืืฉ ืื ื ืขื ืืืืฉื. ืืื worktree ืืคืฉืจ ืืชืช ืืกืืื ื ืงืืืื ืืืฉืชืืื ืืื ืฉืื ืืคืจืืขืื ืืื ืืฉื ื. ืื ืืฉ ืืืงืจ ืืคืจืืืงื ืื ืงืกืื ืื ืื ืื ืกืืื ืืืื ืื ืืืจืืฅ ืขืืชืง ืฉืื ืฉื ืื ืืืขืจืืช ืืืืจืืฅ ืืืืงืืช ืขื ืฉืืื ืืฆืืื ืืื ืืช ืืช ืืคืืฆ'ืจ.
โ ืืืืงืช ืืืืืื ืืฉืืืืจ
ืคืงืืืืช git log -p ื git diff ืืจืืืช ืื ื ืืฆืืจื ื ืืื ืืืืืื ืืื ืืจืกืืืช. ืื ื ืชืชื ืืกืืื ืืขืืื ืขื ืขื ืฃ ื ืคืจื ืชืืืื ืืืคืขืื git diff feature...main ืืื ืืจืืืช ืืช ืื ืืขืืืื ืฉืื. ืชืืื ืืืืืจืช ืืคืจืืืงื ืฉืืื ืืื ืืจืื ืคืขืืื ืื ืื ื ื ืืฆื ืืขืืืื ืฉืื ืืืื ืื ืจืืืื ืืืื, ืืืฉื ืชืืงืื ื ืกืื ืื. ืื ื ืืืจื ืืื ืืืงืฉ ืืืกืืื ืื ืงืืช ืืช ืืคืืฆ'ืจ ืืืืฉืืืจ ืจืง ืืช ืืฉืื ืืืื ืืจืืืื ืืืื ืืื ืฉืืชืืงืฉ ืืื ืืฉืชืืฉ ืืขืฆืื ื git restore ืืื ืืืื ืฉืื ืืืื ืฉื ืขืฉื ืืงืืืฅ ืืกืืื.
โ ืืืืงืช ืื ืืขืืืื ืฉื ืืกืืื ืืื ืืงืืืื ืืืืจืื
ืขืื ืฉืชื ืคืงืืืืช ืกืืคืจ ืฉืืืืฉืืืช ืื:
$ git restore .
$ git clean -f -d
ืืฉืืกืืื ืืชืืื ืืืฉืชืืื ืืื ื ืืืื ืฉืืื ืื ืืืืืื ืฉืชื ืืคืงืืืืช ืืืื ืืืืงืืช ืืช ืื ืืฉืื ืืืื ืืืืืืจืืช ืืืชื ื ืืงืืืื ืืืืจืื. ืืื ืืชื ืืืืื ืฉืื ืืงืืืื ืืืืจืื ืืืจ ืื ืจืืืื ืื ืชืืื ืืคืฉืจ ืืืฉืชืืฉ ื git reset ืืื ืืืืื ืืช ืจืืฉ ืืคืจืืืงื ืืงืืืื ืืฉื ืืืชืจ.
ืืฉ ืืื ืคืงืืืืช ืืื ื ืืกืคืืช ืฉืืชื ืืืืืื ืืืฉืชืืฉ ืขื ืกืืื ื ืงืืืื? ืกืคืจื ืื ืืชืืืืืช.1 419
๐ ืฉืชื ืืืฉืืช ืืืืืงืช ืงืื ืืชืืืื ื Rails
ืืฉืืื ืืืืืช ืืงืกื AI ืืงืืข ืกืคืจืืชื ืืฉืชืืฉืื ืืืงืคืื ืืืืืืืื ืฉืืื ืฉืจืง AI ืืืื ืืืชืื. ืืฉืืื ืืืืืช ืงืื ืฉืืืฆืจ ืขื ืืื AI ืื ืื ื ื ืจืฆื ืืฉืื ืื ืืฉืืืืฉ ืืชืจ ืืชืื ืืืช ืืขืจืืื ืขืืื ืืื ืชืื ืืืช. ืื ื ืจืื ืืคื ืืืื ืจืืฉืื ืืื ืืฉืื ืงืื ืฆืืจื ืฉื. ืืืืืื ืฉื ืืืื ืืื ืืืืงื ืืชืืื ืืช ืจืืืืก:
context 'when multi-part SMS - first chunk' do
it 'stores in Redis and schedules delayed job' do
allow(Vonage::InboundSmsService).to receive(:new).and_return(double(create_message: nil))
allow(described_class).to receive(:set).and_return(described_class)
allow(described_class).to receive(:perform_later)
freeze_time
described_class.handle_concatenated_chunk(params)
expect(described_class).to have_received(:set).with(wait: 2.minutes)
end
end
ืืงืื ืืืคื ืืกืืกืื ืฉืืืืขืื ืืืืงืื ืื ืืืืืขื ืืจืืื ืืจืืฆื ืืืืืง ืฉืืืจื ืืืืง ืืจืืฉืื ืฉืื ื ืืฉืืื ื-2 ืืงืืช ืงืืืื ืฉืชืืกืืฃ ืืช ืืืืงืื. ืืืฉืืืืช ืฉื ืืฉืืื ืืื ืืื ืืฆืืจื ืืืคืื ืืืืืขื ืืืงืืช, ืืืืืจ ืื ืื ืืืืงืื ืืืืขื ืื ืืืืง ืืืืจืื ืืืกืืฃ ืืช ืืืื ืืืืืจ ืืืชื ืืืืืขื ืืืช. ืืื ืื ืจืง ืืืง ืืืืืงืื ืืืืขื ืื ืื ื ืฆืจืืืื ืืืืืช ืฉืขืืจ ืืกืคืืง ืืื ืืืืืง ืืจืืฉืื, ืืื ืื ืฉืืืืฉื ืืืจ ืื ืืืืข ืืืืืจ ืืช ืื ืฉืืฉ. ืคื ืืืืืจ ืคืจืง ืืื ืฉื 2 ืืงืืช ืืืชื ื ืืื ืืคืฉืจ ืืฉืืง ืขื ืื. ืืื ืืงืจื ืื ืฉืืฉืื ืืกืืคืืจ ืฉืื ื ืืื ืื ืืงืื ืืืืืชื ืืื ืืืืืงื.
ืืืืืงื ืื ืกื ืืืืื ืฉืืืจื ืืคืขืืช ืืคืื ืงืฆืื handle_concatenated_chunk ื ืฉืืืช ืืืืขื ืืชืืืื ืช ืืฉืชื ืืงืืช ืงืืืื ืืื ืืืคื ืืืืืขืืช ืืืืงืืืช. ืืื ืืื ืขืืฉื ืืช ืื ืืืืฆืขืืช ืขืจืืื ืฉื ืฉืชื ืชืื ืืืช:
1. ืืจื ืืืช ืืืืืช ืฉืืฉืืื ืืชืืืื ืช ื ืฉืืื ืืื ืืืกืชืื ืขื ืืงืจืืืืช ืืคืื ืงืฆืืืช ืฉื ืืืฉืืื - ืื ืื ื ืืฆืคืื ืฉืืคืื ืงืฆืื set ืชืงืจื ืขื ืคืจืืืจ ืฉื ืฉืชื ืืงืืช ืืืชื ื ืืืฉืืื ืื ืื ืื ื ืืืจืกืื ืืืง ืืืคืื ืงืฆืืืช ืืืืืืืื ืืคืขืื.
2. ืืจื ืฉื ืื ืืืืืช ืฉืืฉืืื ืืชืืืื ืช ื ืฉืืื ืืื ืื ืืืจืืก ืืืืืฉืื ืืื ืืืกืชืื ืืชืืจ ืืืฉืืืืช ืืืชืืืื ืืช ืืืจืืืช ืฉืืฉ ืฉื ืืฉืืื ืืชืืืื ืช ืืฉืชื ืืงืืช ืงืืืื. ืื ืฉืืจืฆื ืืขืฉืืช ืืช ืื ืืืื ืฉืืฉ ืคืขืจ ืืื ืงืื ืืื ืืืฉืืื ืืืชืืืื ืช ืืชืืจ ืืืื "ืฉืชื ืืงืืช ืงืืืื" ืืจืืข ืืืืืงื, ืื ืขืืจื ืืื ืืืื ืฉื ืืืช ืืืจืืข ืฉืืฆืจื ื ืืช ืืืฉืืื ืืืชืืืื ืช ืืจืืข ืื ืืืงื ื ืืืชื. ืืฉืืื ืื ืื ืื ื ื ืืืืื ืืืงืคืื ืืช ืืืื ืืคื ื ืืงืจืืื ืืคืื ืงืฆืื.
ืืืืืจ ืืืืฉื ืืจืืฉืื ื ื ืืชืื ืืช ืืืืืงื ืืื:
context 'when multi-part SMS - first chunk' do
it 'stores in Redis and schedules delayed job' do
allow(Vonage::InboundSmsService).to receive(:new).and_return(double(create_message: nil))
allow(described_class).to receive(:set).and_return(described_class)
allow(described_class).to receive(:perform_later)
described_class.handle_concatenated_chunk(params)
expect(described_class).to have_received(:set).with(wait: 2.minutes)
end
end
ืืืืืฉื ืืฉื ืืื ื ืืชืื ืืช ืืืืืงื ืืื:
context 'when multi-part SMS - first chunk' do
it 'stores in Redis and schedules delayed job' do
freeze_time
expect do
described_class.handle_concatenated_chunk(params)
end.to have_enqueued_job(described_class).at(2.minutes.from_now)
end
end
ืืืืืฉื ืืืขืืจืืืช? ืจืง ืขืื ืกืืื ืืงืื ืฉื ืืชื ืืื ืืฉืืื.1 419
๐ ืืืืจ ืขื ืื ืืื
ืื ื ืืื ืืืืจืื "ืื ื ืื ืืืืข".
ืื ื ืืื ืฉืืืืื ืืฉืืืื ืืืชืืืื ืื ืืื.
ืื ื ืืื ืื ื ืื ืกืื ืืืืืื ืืืืจื ืืื ืื ืืืืงืื ืืช ืื ืืกืืก ืื ืชืื ืื ืืชืื ืืืืฉ.
ืื ื ืืื ืฉืืืืื ืื ื ืืื ืืืจืื ืืืฉืชืืฉืื ืืืืืื ืืื ืืกื ื ืืืืข ื ืื ืก.
ืื ื ืืื ืืืฆืืื ืคืชืจืื ืืช ืืฆืืจืชืืื ืฉืืฃ ืืื ืืฃ ืคืขื ืื ืืฉื ืขืืืื.
ืื ื ืืื ืืฉืืื "ืื ืืชืืืื ืช ืืขืฉืืช ืฉื" ืืคื ื ืฉืืขืืจื ืื ืืืชืงืื ืืืจื ืืื ื ืืื ื.
ืื ื ืืื ืื ืืืืื "ืื ืืกืืื ืืื ืื ื ืืืืฉ ืืื ืชืืื ืคืชืจืื ืืืงื" ืืฉืื ืืงืืืื ืืฉืืื.
ืขืืืื ืืืืืื ืฉืืืื ืืช ืืืืืคื ืืชืื? ืื ืื ืฉืฆืจืื ืื ืืืฉืงืืข ืืืืชื ืชืืื ืืช ืฉืืืคืืืช ืืชืื ืืื ื ืืื. ืืืง ืื ืืืืื ืืืืื ืืืืจ ืขื ืื ืืื ืื ืื ืฉืื ืื ื ืฆืจืืืื.
1 419
ืืฉืชืฃ ืืื ื ืืกืื ืืืื ืืืืืง ืฉื ืืืคืชืืื ื Django
https://www.better-simple.com/django/2026/03/16/give-django-your-time-and-money/
ืืชืื ืืคืืกื ืฉืืื
This isnโt about whether you use an LLM, itโs about whether you still understand whatโs being contributed.
ืืื ืืืคืชื - ืชืฉืชืืฉื ืืกืืื ืงืืืื ืืฉืืื ืืื ืืช ืืืจ ืืืชืจ ืืช ืืคืชืจืื ืืช ืืืืืื ืฉืืืืชื ืืื ืื ืืื ืืงืจื, ืื ืืฉืืื ืืขืฉืืช ืกืคืื ืจืื ืืืืงืืื
1 419
ืขื ืคื ืื ืืฉ ืคื ืฉืืืฉื ืืงืจืื ืื ืืื ืืืืฆืจ ืืืจืืืช ืฉืื ื, ืืื ืืขืฆื ืฉื ื ืืืงืจืื ืืจืืฉืื ืื ืืืืืื ืืช ืืืชื ืงืื ืืืืฆืืจ ืืืจืืืช ืืื ืืจืืจ ืืืืื ืืฆืืื ืืืงืจื ืืฉืืืฉื ืืืืจ ืืืคื ืืืืจ ืืืจืืืื ืืื ืฉื tool call ืชืืื ื ืืชื ืืืฆืื ืขื JSON.stringify. ืกื ืืื ืืืืืื ืืื ืชื ืืงืื ืืืื ืฉืงืื ื:
const args = Object.entries(toolCall.arguments)
.map(([key, value]) => `${key}=${JSON.stringify(value)}`)
.join(", ");
ืกืืื ื ืงืืืื ืฉื ืืกืืชื ืืืจืืฅ ืขื ืืงืื ืฉืืื ืื ืงืืช ืืืชื ืืืืืืข ืืืจืกื ืืงืฆืจื ืืื ืืจืืจ ืฉืื ืืืืืื, ืคืฉืื ืื ืชืืื ืืืชืืืช ืืงืื ืื ืืขืฉื ืืช ืืฆืขื ืื ืืกืฃ ืืื.
โ ืฉืืจื ืชืืชืื ื
ืกืืื ื ืงืืืื ืื ืืืจ ืืืง ืืืชื ื ืคืจื ืืืืืื ืฉืื ื ืืืืฉืืื ืืืืืช. ืืืขืืช ืืื ืื ืืฉืืืืฉ ืืกืืื ืงืืืื ืืื ืืขืืคืช ืืืืจืืช ืืืชืืื ืขื ืคื ื ืืืืืืช. ืืืืกืืจื ืืื ืฉืกืืื ื ืงืืืื ืงื ื ืื ื ืืื ืืื ืฉืื ืืืกืืื ืื ื ืืืืงืื ืขื ืชืืืืจ ืืืืืืื ืืืชื ื ืืจืื ืืืชืจ ืืืจ ืืืจืกื ืจืืฉืื ื ืขืืืืช. ืืช ืืืื ืืื ืฉืืกืื ื ืขืืื ื ืื ืฆื ืืื ืืืืื, ืืืชืืงืฆืข ืืืฉืคืจ ืืช ืืงืื.
ืืืืจื ืืฃ ืคืขื ืื ืืืชื ืืืชืจ ืงืื ืืจืืข ืฉื ืืชื ืืืจ ืืืชืจ. ืืืืจื ืืื ืืืฆืจืื ืืฆืืืื ืืคืฉืืืื ืืืชืจ, ืืงืื ืฉืืืคืฉืจ ืืืชืืืื ืืื ืืืชืจ ืขื ืืขืจืืืช ืืืืืืช ืืืืจื ืืื.1 419
ืฉืชื ืืืืืืืช ืืืืช ืืืืจืืื ืืืฉืชื ืื lines1 ื lines2 ืืืืืื ืืช ืืืชื ืืขืจื. ืืืืืืื ืื ืืืคืฉืจืืช ืืฉืืืืฉ ืืืืจ ืืืงืจืืืืช. ืืืืืื ืืฉื ืืื ืืืืืื ืื ืฉืื ื ืืืงื ืืขืจื ืืืืืืจ ืืขืจื ืื ืจืื ืื ืืืืชื ืืืื, ืื ืื ืงื ืืื map ืืื ืขืืืื ืื ื ืืืื ืื ืงืจื ืคื. ืืืชืจ ืืื, ืืืืฉื ืืฉื ืื ืืฉืืืจื ืืืชื ืขื ืคืื ืงืฆืื serializeMessage ืื ืืคืฉืจ ืืืฉืชืืฉ ืื ืคืจื ืืืืืืื.
ื ืฉืืื ืืช ืื ืืงืืข ืืชืื ืืคืื ืงืฆืื ืืืงืืจืืช:
for (const message of messages) {
if (message.role === "user") {
let textContent: string;
if (typeof message.content === "string") {
textContent = message.content;
} else {
const content = Array.isArray(message.content) ? message.content : [];
textContent = content
.filter((block): block is TextContent => block.type === "text")
.map((block) => block.text)
.join("");
}
lines.push(`User: ${textContent}`);
} else if (message.role === "assistant") {
ืืืืง ืืคื ืืื ืฉืืืคื ืืืืขื ืืฉืืจืช ืืงืกืืื ืืืคืืข ืืขืื ืืงืืืืช ืืคืจืืืงื ืืื ืื ืืคืฉืจ ืืืฉืชืืฉ ืืืืชื ืงืื ืื ืืื ืืืืื ืืชืื ืืืืืช ื for. ืืืชืจ ืืื, ืจืง ืงืจืืื ืืืื ืฉื ืื ืืืืืง ืชืืคืฉืจ ืื ืืืืื ืืื ืืคืื ืงืฆืื ืขืืืืช ืืื ืืฉืืื ืืงืจืื ืืช ืืงืื ืกืืื ืืงืืืื ืฆืจืื ืืืืื ืืืชืจ ืืงืื ืืืืื ืืงืื ืืงืกื.
ืชืื ืืช ืืืื ืืืชืจ ืืคืื ืงืฆืื ืืืชื ืืืืื ืืืืืช:
function serializeAgentMessage(message: AgentMessage): string[] {
switch(message.role) {
case "user":
return serializeUserMessage(message);
case "assistant":
return serializeAssistantMessage(message);
case "toolResult":
return serializeToolResult(message);
default:
throw new Error(`Unknown message role: ${message.role}`);
}
}
export function serializeMessagesForSummary(messages: AgentMessage[]): string {
return messages.flatMap(serializeAgentMessage).join("\n");
}
ืื ืื ื ืจืืืื ืืคืื ืงืฆืื ืืืงืืจืืช ืฉืืืกืจ ืืืืืง ืืืืื ืืืคื ืงืื ืืืืืืง ืืื ืืืคืืข ืืกืคืจ ืคืขืืื ืืคืื ืงืฆืื:
const textContent = content
.filter((block): block is TextContent => block.type === "text")
.map((block) => block.text)
.join("");
โ ืืืคืื ืื ืืืกืืจ ืืื ืืืงืจืื ืืืคืฉืจืืื (ืืืืงืจืื ืื ืืคืฉืจืืื)
ื ืงืืื ืฉื ืื ืฉืืืืจืช ืืืื ืืงืื AI ืืื ืชืื ืืช ืืคื ืกืืื, ืืืืืจ ืงืื ืืืกืื ืืื:
if (message.role === "user") {
let textContent: string;
if (typeof message.content === "string") {
textContent = message.content;
} else {
const content = Array.isArray(message.content) ? message.content : [];
textContent = content
.filter((block): block is TextContent => block.type === "text")
.map((block) => block.text)
.join("");
}
ื ืฉืื ืื - ืื ืชืืื ืืืืืขื ืืื ืืกืื string ืื ื ืงื ืืืชื, ืืืจืช ืื ืืื ืืกืื ืืขืจื ืื ื ืืงื ืืื ื ืืช ืื ืืืืืงืื ืฉืื ืืกืื ืืงืกื, ื ืืงื ืืช ืืืงืกื ืฉืืื ืื ืืื ืืืชื ืืฉืืจื ืืืช. ืื ืืชืืื ืืื ืืื ืกืื ืืืจ ื ืืืืจ ืืืจืืืช ืจืืงื.
ืืืืืง ืืืคื ื-3 ืืงืจืื ืืื ืื ืืกืืืจ ืื ื ืืืื ืกืืื ืืืืขืืช ืืฉ ืืืื ืฉืืชืืื ืืืื ืืงืกื ืื ืืขืจื. ืืืชืจ ืืื ืืงืื ืืืื ืืืคื ืืืืืขื ืฉืืฉ ืื ืืกืคืจ ืืืืงืื ืฉื ืืงืกื, ืืืจืืช ืฉืืคืฉืจ ืืื ืืขืฆืืจ ืืืืืง ืืจืืฉืื ืื ืืืื ืืืืืช ืืงืกืืืื ืืืืง ืืงืกื ืืื ืืืืืขื. ืื ืืืื ืืขืชืื ืฉืื ืื ืืืงืื ืืืจ ืฉืืืจืื ืืื ืฉืืคืื ืงืฆืื ืชืืคืขื ืจืง ืขื ืืืืขืืช ืืกืื ืืงืกื ืื ืจืง ืขื ืืืืขืืช ืืกืื ืืขืจื ืืืื ืงืฉื ืืืืืช ืืช ืืฉืื ืื ืืืืืืง ืืช ืืงืื ืืืืืชืจ.
ืกืคืจืืืช pi ืฉืืื ื ืืืืข ืืืืคืืก AgentMessage ืืืื ืฉืืืืืจื ืืช ืืืืืขืืช ืืฉืชืืฉื ืืฉืืจื ืืืื ืืื ืืืฆืื ืชืืื ืืงืกืืืืื ืืืืืขื:
const content =
typeof this.message.content === "string"
? this.message.content
: this.message.content.find((c) => c.type === "text")?.text || "";
ืืืฅ ืืื ืฉืืงืื ืงืฆืจ ืืืชืจ ืืื ืื ืืจืื ืืืชืจ ืืืืืง. ืืืืืช ืืืืืง ืื ืื ืฆืจืืืื ืืช ื map ืื join ืืื ืืืื ืืช ืื ืืืืืงืื ืฉื ืืืงืกื ืื ืืืืื ืืฉ ืจืง ืืื.
โ ืืกืจ ืืขืืจ ื ืืงืืื
ืกืืื ื ืงืืืื ืืจืื ืคืขืืื ืขืืฆืจืื ืืคื ื ืืืื, ืืฉืืจืืจ ืฉืื ืืืืืื ืืชืงื ืืช ืืืขืื ืขื ืขืื ืืืืจืฆืื ืืื ืืฉืื ืืืืืื ืื ืขืื. ื ืชืืื ื ืืืืืง ืืื:
const args = Object.entries(toolCall.arguments)
.map(([key, value]) => {
if (typeof value === "string") {
return `${key}=${JSON.stringify(value)}`;
}
if (typeof value === "object" && value !== null) {
return `${key}=${JSON.stringify(value)}`;
}
return `${key}=${String(value)}`;
})
.join(", ");1 419
๐ ืกืงืืจืช ืคืื ืงืฆืืืช TypeScript ืฉืืชื ืกืืื ืงืืืื
ื ืชืงืืชื ื stavrobot, ืกืืื AI ืฉืืืืจ ืืืืืช ืืจืกื ืืืืืืืช ืฉื ืืืคืืงืื. ืื ืืชืงื ืชื ืืื ืืืืจ ืืืคืจืืืงื ืืงืื ืคืชืื ืืืืคืชื ืืืืืฉ ืฉืืื ืขืื ืขื ืกืืื ืงืืืื ืืื ืืื ืืช ืืช ืื ืืื ืื ืืขื ืืื ืืืกืชืื ืืงืื. ืืคืฉืจ ืืืฆืื ืืช ืืคืจืืืงื ืืงืืฉืืจ ืืื:
https://github.com/skorokithakis/stavrobot
ืืคืืกื ืืืื ื ืชืืื ื ืืคืื ืงืฆืื ืืืช ืืชืื ืืงืื ืื ืืชืจ ืื ืืกืคืจ Anti Patterns, ืืืืืจ ืชืื ืืืช ืงืื ืฉืืืืืืช ืฉืื ื ืืืื ืฉืืืืจืืช ืืฆืืจืืช ืฉืื ืืช ืืงืื AI. ืชืื ืืืช ืืื ืืขืืื ื ืืื ื ืืฉื ืจืฆื ืืืืฉืื ืืืคืชื ืืช ืืคืจืืืงื.
ื ืชืืื ืืืฆืืช ืงืื ืืคืื ืงืฆืื ืืื ืฉืืฆืืชื ืืืชื ืืคืจืืืงื:
export function serializeMessagesForSummary(messages: AgentMessage[]): string {
const lines: string[] = [];
for (const message of messages) {
if (message.role === "user") {
let textContent: string;
if (typeof message.content === "string") {
textContent = message.content;
} else {
const content = Array.isArray(message.content) ? message.content : [];
textContent = content
.filter((block): block is TextContent => block.type === "text")
.map((block) => block.text)
.join("");
}
lines.push(`User: ${textContent}`);
} else if (message.role === "assistant") {
const content = Array.isArray(message.content) ? message.content : [];
const textContent = content
.filter((block): block is TextContent => block.type === "text")
.map((block) => block.text)
.join("");
if (textContent) {
lines.push(`Assistant: ${textContent}`);
}
for (const block of content) {
if (block.type === "toolCall") {
const toolCall = block as ToolCall;
const args = Object.entries(toolCall.arguments)
.map(([key, value]) => {
if (typeof value === "string") {
return `${key}=${JSON.stringify(value)}`;
}
if (typeof value === "object" && value !== null) {
return `${key}=${JSON.stringify(value)}`;
}
return `${key}=${String(value)}`;
})
.join(", ");
lines.push(`Assistant called ${toolCall.name}(${args})`);
}
}
} else if (message.role === "toolResult") {
const content = Array.isArray(message.content) ? message.content : [];
const textContent = content
.filter((block): block is TextContent => block.type === "text")
.map((block) => block.text)
.join("");
lines.push(`Tool result (${message.toolName}): ${textContent}`);
}
}
return lines.join("\n");
}
ืืคืื ืงืฆืื ืืงืืืช ืืขืจื ืฉื ืืืืขืืช ืืฆืจืืื ืืืคืื ืืืชื ืืืขืจื ืฉื ืฉืืจืืช ืืืืืจ ืื ืืืืขื ืฆืจืืื ืืืคืื ืืฉืืจืช ืืงืกื ืืืขืจื ืืชืืฆืื.
โ ืืืืื ืืืฆืจืช ืืืงืื map
ืชืื ืืช ืืขืืืชืืช ืจืืฉืื ื ืืงืื ืืื ืืืืืช ื for. ืืืืืื ืคืฉืืื ืฉืชื ืืืืืืืช ืืืื ืืืืช:
const messages = [{text: 'one'}, {text: 'two'}, {text: 'three'}];
// 1. using for loop
const lines1 = [];
for (const message of messages) {
lines1.push(message.text);
}
// 2. using map
const lines2 = messages.map(message => message.text);
ืืืืื ืืื ืฉืชื ืืืืืืืช ืืื ืืืืงื ืืื ืฉืื ืืคืฉืจ ืืขืฉืืช ืืืืืื ืืฉื ืื. ืืืืืช map ืืืคืฉืจืช ืจืง ืืืืคื ืฉื ืจืฉืืืช ืขืจืืื ืืืช ืืจืฉืืื ืืืจืช. ืืืืืช for ืืื ืืืืืช ืืืชืจ ืืืืคืฉืจืช ืื ืคืขืืืืช ื ืืกืคืืช. ืืืงืจื ืฉืื ื ืืืืืื ืืืืช ืืฉืชืืฉืช ืืืืืืช ืฉื for ืืืืฆืจ ืืขืจื ืคืื ืืืืจื ืฉืื ื ืืืงืื, ืืืืืจ ืืขืจื ืืฉืืจืืช ืฉืืืืืจ ืขืฉืื ืืืืื ืืืชืจ ืืฉืืจื ืืืช ืืื ืืืืขื - ืืื ืงืฉื ืื ื ืืจืืืช ืืช ืื ืืงืจืืื ืคืฉืืื ืฉื ืืงืื.
ืคืชืจืื ืืืืืง ืืืชืจ ืืฉืชืืฉ ื flatMap ืืื ืืืฆืืจ ืืกืคืจ ืฉืืจืืช ืืื ืืืืขื. ืื ื ืืืืื ืคืฉืืื ืืงืื ืงืื ืืืืืืฉ ืืช ืืขืงืจืื:
const messages = [{text: 'one', times: 3}, {text: 'two'}, {text: 'three'}];
const lines1 = [];
for (const message of messages) {
const times = message.times ?? 1;
for (let i=0; i < times; i++) {
lines1.push(message.text);
}
}
console.log(lines1);
function serializeMessage(message) {
const times = message.times ?? 1;
return new Array(times).fill(message.text);
}
const lines2 = messages.flatMap(serializeMessage);
console.log(lines2);1 419
๐ ืืืืจืื ืืืฆืืืืช
ืืฉืื ืื ื ืืืื ืื ืืื ืืืจืื ืขืืืืื ืืจืื ืืืชืจ ืงื ืื ื ืืจืืืช ืืช ืืืืืืฆืื ืืืืชื ืืืืืื ืืื ืืืืื ืืืืืค. ืืจืืจ ืฉืืืืื ืืืื ืืืจืืืื ืืืื ืืกืืืืืื ืฉืื ืืืืืช ืื ืื ืืืื. ืื ืืืชืจ ืื ืฉืื ืืื ืืืืื ืืืืื ืืืื ืื ืืื ืืจืืืื.
ืืจืืจ ืฉืืฉืืื ืืืืจ ืฉืคื ืืฆืืจื ืฉืืืคืช ืฆืจืื ืืื. ืืฉืื ื ืคืจืกืืืช ืฉืืืืืื ืื ืฉืชืื ืฉืืืฉื ืืืืฉืื ืื ื ืืืืจ ืกืื ืืช ืฉืืืฃ ืื ื ืืืจื. ืืืืชื ืืกืคืืง ืฉืคืืช ืืฉืืื ืืืืืจ ืืช ืืืืืืืช ืืืืืืืฆืื ืฉืื ืืื ื ืืืืข ืื ืืคืฉืจื ืืื ืจืง ืืืื.
ืืืืจื ืฉืืืฉ ืืืฆื ืฉื ืื ืฉื ืฉืืืืช ืขื ืืืืื ืฉืคื ืืืืืื ืขืงืจืื ืืช ืืขืืืื ืฉืืื ืื ืื ื ืืืจ ืืืืจืื ืืืขืช ืื ืืคืฉืจื ืืื ืจืง ืืืื ืื ืืืชื. ืื ืื ื ืืืื ืื ืฉ LLM ืืื ืืืื ืช ืืฉืืื ืืฉืืืงืกื ืฉืืื ืืืชืื ืืื ืชืืฆืื ืฉื ืืคืจืืืคื ืืฉื ื ืชืื ื ืืืืืื ืฉืื, ืืชืืกืคืช ืชืืืื ืกืืืืกืื. ืืืจืืช ืืจืฆืื "ืืืืืช ืืืืื" ืงื ืืจืืืช ืืื ืืืฆืจื AI ืจืืื ืื ืฉืืืื ืืช ืืืืืฅ.
ืืฉืืืฉืื ืืืืื ืกืืื ืงืืื ืฉืืกืืื ืืฉืืืื ืืฉืืืืช ืื ื ื ืืืจ ื OpenClaw ืืืืขืืืืช ืฉืืื ืขืฉื ืืื ืฉืื. ืืืขืืืืช ืืืืืืืช ืื ืืืง ืืืชื ื ืคืจื ืืืืื ืฉืคื ืืืื ืืจืืจ ืฉืื ื ืื ืืืื ืืกืืื ืขื ืืืื ืฉืืื.
ืืฉืืืฉืื ืืืืื ืกืืฃ ืืืขืืืช ืืืืืช ืืืืืข ืืืืืช ืืืฆืจ AI ืืืฉ ืฉืืงืจื ืืช ืืงืื ืฉืื ืืื ืืืคืฉ ืฉืืืืืช ืื ื ื ืืืจ ืฉืืคืชืจืื ืืืขืืืช ืืืืื ืืื ืื ืงืจืืื ืื ืคืขืืืช ืฉื ืืงืื ืืื ืชืืืื ืคืืชืื ืื ืืืื ืืจืืื ื ืฉืื. ืืื ืืืื ืฉืจืง ืขืืืจ ืขื ืืงืื ืืืื ืืขืืืจ ืืื ืืื ืืชืืืื ืืืื ืืขืืื ืื ื ืืื ืืืคื ืืืขืืืช ืฉืงืืจืืช ืืืืฅ ืืกืงืืค ืฉื ืืืชื ืืื (ืืืฉื ืฉืื ืืื ืืจืกื ืืคืืืคืืจืืช ืืจืืฆื, ืืขืืืช ืงืื ืคืืืืจืฆืื ืื ืื ืืกื ืืืจืชืืช).
ืืฉืืืฉืื ืืืืื ืกืืื AI ืฉืืืฆื ืืช ืืกืืื ืืื ืชืงืื ืืืขืจืืช ืื ื ืืคืืื ืื ืื ืกื ืืืชื. ืื ื ืืืื ืฉืืืืื ืืช ืฉืืื ืืืืืช ืืื ืื ื ื ืืืจ ืืื ืืคืขืืื ืฉืืืื ืฉืคื ืืืืื ืจืืืื ืืืืืื ืขื ืืกืืก ื ืชืื ื ืืืืืื ืฉืื, ืจืืืื ืฉืจืง ืืืืืื ืขืืืง ืืืชืจ ืืืืืืช ืืืจื ื. ืื ืขืื ืืืกืืก ืฉื ืืืื ืฉืื ืืื ืืืื ืฉืคื ืืืืืช ืื ืืืง ืืืกืืคืืจ.
ืืืืืื ืืืืืช ืืืืื ืื ืืื ืขื ืื ืฉืชืืื ืืฉ ืืช ืืกืืืื ืืงืื ืฉืชืืื. ืืื ืกืงืจืืืื ื ืื ืืฉื ืฉื ืชื ื ืืจืฉืชืืช ืืืจืชืืืช ืืื ืื ืฉืื ืืืจืจืื ืขืื ืืขืื ืืฉืืื ืืกืืืื ืืงืื ืืงืจืื ืืฉืื ืืขื ืืื. ืขื ืืืชื ืืฉืงื ืฆืจืื ืืืฆืื ืืืฉื ืฉืืชืืจ ืืช ืืืจืืฃ ืืืจื ืืืืื ืืื, ืืืื ืืื, ืืงืกื ืืื. ืืื ืืื ืฉืื ืืจืืง. ืืฉืืื ืืืจืืืื ืืกืฃ ืขืืืฃ ืืขืืื ืืื ืืืื ืืืื. ืืฉืืื ืืืชืื ืืขืจืืืช ืืฆืืืืช ืขืืืฃ ืืืืื ืชืื ืืช ืืื ืืงืืืช ืฉืกืืื ืืงืืืื ืืื ืืฆืืื ืืืืฆืจ ืืืืืง ืืช ืืืขืจืืช ืฉืืืืื ืช.
1 419
๐ ืืืคืื ืืฉืืืืืช ืืงืื asyncio
ืืงืื ืืื ืืื ืืจืกื ืคืฉืืื ืฉื ืงืืข ืฉืืชื ืื ืกืืื ืงืืืื ืืื ื ืฉืื ืฉืขืฆืจืชื ืืงืจืื ืืคื ื ืฉืืกืืืชื ืืงืื ืืืชื. ืืืื ื ืจืื ืืช ืืงืื ืืื ื ื ืชื ืื ืืกืืื ืขืฉื ืืคื, ืืืคื ืืื ืืขื ืืื ืืคืฉืจ ืืืืื ืขื ืืืืืืื ืืฉืืืืืช ื asyncio:
async def worker(..., queue, visited, ...):
while True:
try:
url, depth = await queue.get()
except asyncio.CancelledError:
break
try:
...
except Exception as e:
logger.error(f"Error processing {url}: {e}")
finally:
queue.task_done()
if stop_event.is_set():
break
ืืงืื ืืืฉื url ืืชืืจ ืืื ืขืืฉื ืืฉืื ืขื ื url ืืื, ืืื ืื ืฉืืขื ืืื ืื ืืื ืื ืคืงืืืืช ืืืืคืื ืืฉืืืืืช ืืืืืืืืื.
โ ืืืืื ืืคื ื ืงืืืช ืืืื ื
ื ืชืืื ื ืืืืืง ืืจืืฉืื:
while True:
try:
url, depth = await queue.get()
except asyncio.CancelledError:
break
ืื ืคืชืืื ืืฉ ืฉื ืืืคืื ื ืคืจื ื CancelledError? ืืืื ืจืง ืืื ืืงืื ืืช ื break? ืืชืฉืืื ืฉืืฉืืืืืื ืคืขืืื ืืกืื ืืจืื ืืช ืืืืืื ืืืืข ืืืืืฉืื await, ืืืืืจ ืื await ืืคืื ืงืฆืื ืขืืื ืืืจืืง CancelledError. ืื ืืืืืื ืงืืจื ืืคื ื ืฉืืฉืื ื ืืืื ื ืืืชืืจ ืขืืื ื ืืฆืืช ืืืืืืื ืืื ืืืืืืข ืขื task_done. ืืื ืืืคืื ืืืืื ืื ืืฉืืืื ืชืืืข ื finally ื task_done ืืืืื ืื ืืืงืจื ืฉื ืืืืื ืืืื ืืืชื ื ืืืืื ื.
โ ืืืคืื ืืฉืืืืืช ืืื ืืืืืืื
ืืืืืง ืืฉื ื ืืืคื ืืฉืืืืืช ืืกืื Exception. ืืื ืฆืจืื ืืืืืจ ืฉ CancelledError ืืืจืฉ ื BaseException ืืคืืืชืื ืืื ื Exception ืืืื ืื ืืืืคื ื except. ืื ื ืืืืืจ ืืงืื ืืื:
try:
...
except Exception as e:
logger.error(f"Error processing {url}: {e}")
finally:
queue.task_done()
if stop_event.is_set():
break
ืฉืืืื ืจืืืื ืชืืืข ืืื ื except ืืชืฆืื ืืช ืืืืขืช ืืฉืืืื. ืืืจืื ืืืคืขื ื finally, ืืืฉืืื ืชืืืื ืืชืืจ ืืืฉืืื ืืื ืืืคืขื ืืื ืืืฆืืื ืื ื ืฆื ืืืืืืื. ืืืืื ืืืืข ืืฉืจ ื finally, ืฉืื ืืืืื ืืืืืื ืขื task_done ืืื ืื ืืืฉืื ืืคืขืคืข ืืืขืื ืืืืฆืื ืืืชื ื ืืืืืืื.
ืื ืืืขืื ืขื ืื? ืงืื ืืืฆืื ื ืฉืืจืืฅ ืืช ืืคืื ืงืฆืื ืืืืื ืืฆืืจื ืืืชืืืื ืขื ืชืฉืืื ืื ืขืงืืืช - ืื ืืืืืื ืืชืจืืฉ ืืืื ืืืชื ื ืืคืจืื ืืืชืืจ ืื ืืคืขืืืื break ืืคืฉืื ืืกืืืืื ืืช ืืคืื ืงืฆืื ืจืืื (ืืชืืจ ืืฆืืื). ืื ืืืืืื ืืชืจืืฉ ืืืื ืืืฆืืข ืืขืืืื ื CancelledException ืืืจืื ืืกืืื ืืคืื ืงืฆืื ืืงืื ืืืฆืื ื ืืืื ืืจืืืช ืฉืืื ืืชืจืกืงื ืืืื ืืืืื.
ืืขืื ืฉื ืื ืืงืื ืืื ืืืืคืื ืืฉืืืืืช ืฉืืื ื ืืืืืืื - ืืื ืืืืคืื ืืื ืืกื ืืื ืืืชืื ืืืืขื ืืืื ืืืจืืช ืฉืืขืืืืช ืจืฉืช ื ืืื ืืืชืจ ืื ืกืืช ืคืจืื ืืื ืคืขืืื, ืืคืืืช ืขืืืจ ืฉืืืืืช ืืื ืืืช. ืืงืื ืืื ืื ืืืื ืื ืื ืื ืืงืืืืื ืฉืืืืืช ืืื ืื ืื ืื ืื ืื ืกืืื ืืช ืืืืจืื.
ืกื ืืื ืืงืื ืืื ืขืืื ืืื ืืืชืจ ืขื context manager ืฉืืืคื ื task_done ืืืงืื ืืื ื ื except ืืืคืื. ืื'ืืื ื ืื ืืืชื ืืขืื ืืืชืื ืืช ืื ืขื ืืื ืฉืจืฆืืชื ืืฉืืืงืฉืชื ืืืจืืง ืืืืื ืืื ืืจืืืช ืืช ืืืขืืืช ืืงืื ืืืงืืจื ืืืืืื ืืื ืื ืฆืจืื ืืืืืช. ืื ืืงืื ืฉืืงืืชื ืืกืืฃ:
from contextlib import asynccontextmanager
import asyncio
@asynccontextmanager
async def get_task(queue):
# If this is cancelled, Exception propagates and finally is NOT run (which is correct)
item = await queue.get()
try:
yield item
finally:
queue.task_done()
async def worker(queue):
# No need to catch CancelledError at all!
# When task.cancel() is called, the exception will break the loop
# automatically and cleanly cancel the task.
while True:
async with process_task(queue) as (url, depth):
... # Do work1 419
๐ ืื ืืืืืื ืื ืืืืงืื ืืืื ืืช ืืคื ื ืฉืืฆืืขืื ืฉื ืืคืจืืืงื
ืืกื ืืฆืืจืช ืจืืคื ืืืฉ ืืืืืืื ืืืื ืชืืืืช ืืชืืช ืืฉื ืืคืจืืืงื ืขื ืืฆืขื ืืฉื ืืงืจืื. ืื ืืขืื ื ืืืืฉ ืฉื ืืขืืื ืืฉื ื ืืช ืืฉื. ืืื ื ืกื ืืช ืื ืื ืืชื ืื ืืืืจืื:
https://github.com/new
ื ืฉืื ืื ืฉืืืจื ืฉืืืืฆืื ืขื ืืฉื ืืืงืจืื ืฉืืื ืืฆืืข ืืืคืืขื ืชืืืืช ื ืืกืคืช, Checking availability, ืืจืง ืืืจื ืืืืืงื ืืืคืืขื ืืชืืืืช ืืืจืืงื ืฉืืืืจืช ืฉืฉื ืืคืจืืืงื ืืืื. ืืืชื ืจืืฆื ืืฉืืื, ืื ืืืืืชื ืืืืืง ืืคื ื? ืืื ืฉืชืฆืืขื ืื ืฉื ืืงืจืื ืื ืืื ืืืจ ืชืคืืก?
ืื ืืงืื ืฉืื ืื ื ื ืชืงื ืืืืืื ืืืื: ืงืื ืฆื ืฉืจืช ืืืืฆืจ ืืืื ืืงืจืื ืืฆืจืื ืืืืื ืื ืืืืื ืืื ืืืื ืืืงื ืืคื ื ืฉืืฆืืข ืืืชื ืืืงืื. ืืืื ืกืืื ืงื ืืื ืืืชืื ืงืื "ื ืืื", ืืืืืจ ืืืืจืื ืืช ืืืืื, ืืืืื ืฉืืื ืคื ืื ืืื ืืกืืก ืื ืชืื ืื ืืื ืืืืฉืื ืืืืืื ืขื ืฉืืืฆืืื ืืืื ืคื ืื. ืืืืื ืืืืื ืืืืช ืื ืชืจืืฅ ืืืชืจ ืืื ืคืขืืื ืื ืืกืืืื ืืืืจืื ืืืื ืชืคืืก ืืื ืืืื ื ืืื.
ืืืืืื ืืืืจืื ืื ื ืคื ืืฉืื ืืืื ืืฉืื ืืืื ืงืืืื - ืืฉ ืืฆืืื ืืื ืืืชืจ ืืฉืื ืืืืืืจ ืชืฉืืื ืืืจ ืืืฉืจ ืืืืืืจ ืืช ืืชืฉืืื ืื ืืื ื. ืจืื ืืื ืฉืื ืฉืืืืขืื ืืืกื ืืื ืืืืื ืื ืืฉืชืืฉื ืืฉื ืืืงืจืื ืืื ืืืืจื ืฉื ืืขืฆืื, ืืื ืืื ืฉืืืืจื ืจืื ืืืื ืืงืืื ืืืื ืคื ืื. ืืกืืืื ืืงืื ืืืื ืชืคืืก ืืื ืืืืื ืื ืื ื ืืื ืฉืืื ืืืืื ืืืืื ืืื ืขื ืืืืืงื ืืจืืฉืื ื ืืขืืืฃ ืืืืืง ืจืง ืขืืืจ ืื ืฉืืืืช ืืชืืืื ืืืฉืชืืฉ ืืืืื ืื.
ืืืืฆืืขืื, ืฉืื ืืื ืืืืื, ืืืคืชื ืืืืฉืจ ืืื ืขืฆืืืช ืืืืืื ืืช. ืื ืฉืืคืฉืจ ืื ืืขืฉืืช ืขืืืฃ ืื ืืขืฉืืช, ืืื ืืืืืื ืืขืฉืืช ืขืืืฃ ืืื ืฉืืืชืจ ืืืืืจ.
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
