0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

๐Ÿฅ• Python้žๅŒๆœŸๅ‡ฆ็†๏ผˆasync/await๏ผ‰ๅ…ฅ้–€๏ผšๆ–™็†ใ‚’ไพ‹ใซ้ †ๅบใจไธฆ่กŒใฎ้•ใ„ใ‚’็†่งฃใ™ใ‚‹๏ผˆ่‡ชๅˆ†็”จ๏ผ‰

Posted at

ใฏใ˜ใ‚ใซ

Python ใซใฏ้žๅŒๆœŸๅ‡ฆ็†ใ‚’่กŒใ†ใŸใ‚ใฎ async / await ใจใ„ใ†ๅผทๅŠ›ใชๆง‹ๆ–‡ใŒใ‚ใ‚‹ใ€‚
ใ—ใ‹ใ—ใ€่‡ชๅˆ†่‡ช่บซใ€Œ้›ฃใ—ใ„๏ผใ€ใ€Œไฝ•ใŒ่ตทใใฆใ‚‹ใฎใ‹ๅˆ†ใ‹ใ‚‰ใชใ„๏ผใ€ใจๆ„Ÿใ˜ใฆใ„ใ‚‹ใŸใ‚ใ€้ ญใฎๆ•ด็†ใ‚‚ๅ…ผใญใฆๆ–™็†ใฎๆ‰‹้ †ใ‚’ไพ‹ใซใ—ใฆ ใ€Œ้ †็•ชใซๅ‡ฆ็†ใ™ใ‚‹ใ€ ใ“ใจใจ ใ€Œไธฆๅˆ—ใซๅ‡ฆ็†ใ™ใ‚‹ใ€ ใฎ้•ใ„ใ‚’ใพใจใ‚ใฆใฟใ‚‹ใ€‚

ใชใœ้žๅŒๆœŸๅ‡ฆ็†ใฏ้›ฃใ—ใๆ„Ÿใ˜ใ‚‹ใฎใ‹๏ผŸ

้€šๅธธใฎPythonใ‚ณใƒผใƒ‰ใฏใ€ŒไธŠใ‹ใ‚‰้ †็•ชใซๅ‡ฆ็†ใ•ใ‚Œใ‚‹ใ€ใŸใ‚ใ€ใ‚ใพใ‚Šๆ„่ญ˜ใ—ใชใใฆใ‚‚ๅ‹•ไฝœใ‚’ไบˆๆƒณใงใใ‚‹ใ€‚
ใ—ใ‹ใ—ใ€้žๅŒๆœŸๅ‡ฆ็†ใงใฏ ใ€Œใฉใ“ใงๅ‡ฆ็†ใŒๆญขใพใ‚Šใ€ใฉใฎๅ‡ฆ็†ใŒไธฆๅˆ—ใงๅ‹•ใใ‹ใ€ ใ‚’่€ƒใˆใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใ€ใ“ใ‚ŒใŒ้žๅŒๆœŸๅ‡ฆ็†ใ‚’้›ฃใ—ใๆ„Ÿใ˜ใ‚‹ๅŽŸๅ› ใงใ‚ใ‚‹ใจ่€ƒใˆใ‚‰ใ‚Œใ‚‹ใ€‚

๐Ÿ“Œ ใพใšใฏ้€šๅธธใฎ้ †็•ชๅ‡ฆ็†๏ผˆๅŒๆœŸๅ‡ฆ็†๏ผ‰

ไปฅไธ‹ใฏใ€ๆ–™็†ใฎๆ‰‹้ †ใ‚’้ †็•ชใซๅฎŸ่กŒใ™ใ‚‹ไพ‹ใงใ™ใ€‚

example.py
def cook():
    print("โ‘ ้‡Ž่œใ‚’ๅˆ‡ใ‚‹")
    print("โ‘ก็…ฎใ‚‹")
    print("โ‘ขๅ‘ณไป˜ใ‘ใ™ใ‚‹")
    print("โ‘ฃๅฎŒๆˆ๏ผ")

cook()
ๅ‡บๅŠ›
โ‘ ้‡Ž่œใ‚’ๅˆ‡ใ‚‹
โ‘ก็…ฎใ‚‹
โ‘ขๅ‘ณไป˜ใ‘ใ™ใ‚‹
โ‘ฃๅฎŒๆˆ๏ผ

ใ“ใ‚Œใฏ้žๅธธใซๅˆ†ใ‹ใ‚Šใ‚„ใ™ใ„ใ€Œไธ€ๆœฌ้“ใ€ใฎๅ‡ฆ็†ใจใชใ‚Šใพใ™๏ผˆไธŠใ‹ใ‚‰้ †็•ชใซๅ‡ฆ็†ใ•ใ‚Œใ‚‹๏ผ‰

๐ŸŒ€ ้žๅŒๆœŸๅ‡ฆ็†ใงไธฆ่กŒใ—ใฆๅ‹•ใ‹ใ™

ใ“ใ“ใ‹ใ‚‰ใŒๆœฌ้กŒใ€‚
ไปฅไธ‹ใฎใ‚ˆใ†ใซ async def ใงๅฎš็พฉใ—ใŸ้–ขๆ•ฐใ‚’ไฝฟใ„ใ€await asyncio.gather(...) ใ‚’ไฝฟใฃใฆไธฆ่กŒๅ‡ฆ็†ใ‚’ๅฎŸๆ–ฝใ€‚

example.py
import asyncio

async def carrot():
    print("ใƒ‹ใƒณใ‚ธใƒณใ‚’ๅˆ‡ใฃใฆใ„ใพใ™")
    await asyncio.sleep(2)
    print("ใƒ‹ใƒณใ‚ธใƒณๅˆ‡ใ‚Œใพใ—ใŸ")

async def potato():
    print("ใ‚ธใƒฃใ‚ฌใ‚คใƒขใ‚’ๅˆ‡ใฃใฆใ„ใพใ™")
    await asyncio.sleep(1)
    print("ใ‚ธใƒฃใ‚ฌใ‚คใƒขๅˆ‡ใ‚Œใพใ—ใŸ")

async def seasoning(name):
    print(f"{name}ใ‚’ๅŠ ใˆใฆใ„ใพใ™")

async def cook_all(menu, seasoning_name, **kwargs):
    print(f"{menu}ใ‚’ไฝœใ‚Šใพใ™")

    # ไธฆๅˆ—ใงๅ‡ฆ็†
    await asyncio.gather(*[func() for func in kwargs.values()])

    await seasoning(seasoning_name)
    print(f"{menu}ใŒๅฎŒๆˆใ—ใพใ—ใŸ๏ผ")

if __name__ == "__main__":
    asyncio.run(
        cook_all(
            menu="้‡Ž่œใ‚นใƒผใƒ—",
            seasoning_name="ๅกฉ",
            step1=carrot,
            step2=potato
        )
    )
ๅ‡บๅŠ›
้‡Ž่œใ‚นใƒผใƒ—ใ‚’ไฝœใ‚Šใพใ™
ใƒ‹ใƒณใ‚ธใƒณใ‚’ๅˆ‡ใฃใฆใ„ใพใ™
ใ‚ธใƒฃใ‚ฌใ‚คใƒขใ‚’ๅˆ‡ใฃใฆใ„ใพใ™
ใ‚ธใƒฃใ‚ฌใ‚คใƒขๅˆ‡ใ‚Œใพใ—ใŸ
ใƒ‹ใƒณใ‚ธใƒณๅˆ‡ใ‚Œใพใ—ใŸ
ๅกฉใ‚’ๅŠ ใˆใฆใ„ใพใ™
้‡Ž่œใ‚นใƒผใƒ—ใŒๅฎŒๆˆใ—ใพใ—ใŸ๏ผ

ๆณจ็›ฎใƒใ‚คใƒณใƒˆ
ใ‚ธใƒฃใ‚ฌใ‚คใƒข ใŒ1็ง’ใ€ใƒ‹ใƒณใ‚ธใƒณ ใŒ2็ง’ โ†’ ใ‚ธใƒฃใ‚ฌใ‚คใƒขใฎๅ‡ฆ็†ใŒๅ…ˆใซ็ต‚ใ‚ใ‚‹๏ผ
gather() ใซใ‚ˆใฃใฆๅŒๆ™‚ใซๅ‡ฆ็†ใŒ้–‹ๅง‹ใ•ใ‚Œใ‚‹ใŸใ‚ใ€ๅ‡ฆ็†ใฎ้ †็•ชใŒๅ…ฅใ‚Œๆ›ฟใ‚ใ‚‹ๅฏ่ƒฝๆ€งใŒใ‚ใ‚‹

๐Ÿ” ้ †็•ชใซๅ‡ฆ็†ใ—ใŸใ„ๅ ดๅˆใฏใฉใ†ใ™ใ‚‹๏ผŸ

้žๅŒๆœŸ้–ขๆ•ฐใงใ‚‚้ †็•ชใ‚’ๅฎˆใฃใฆๅฎŸ่กŒใ—ใŸใ„ๅ ดๅˆใฏใ€ไปฅไธ‹ใฎใ‚ˆใ†ใซ for ใƒซใƒผใƒ—ใง awaitใ™ใ‚‹ใ€‚

example.py
for step in kwargs.values():
    await step()
ๅ‡บๅŠ›
ใƒ‹ใƒณใ‚ธใƒณใ‚’ๅˆ‡ใฃใฆใ„ใพใ™
ใƒ‹ใƒณใ‚ธใƒณๅˆ‡ใ‚Œใพใ—ใŸ
ใ‚ธใƒฃใ‚ฌใ‚คใƒขใ‚’ๅˆ‡ใฃใฆใ„ใพใ™
ใ‚ธใƒฃใ‚ฌใ‚คใƒขๅˆ‡ใ‚Œใพใ—ใŸ

ใฎใ‚ˆใ†ใซ้ †็•ช้€šใ‚ŠใซๅฎŸ่กŒใ•ใ‚Œใพใ™ใ€‚

๐Ÿง  ้žๅŒๆœŸๅ‡ฆ็†ใฎ็†่งฃใƒใ‚คใƒณใƒˆใพใจใ‚

async def ใงๅฎš็พฉใ•ใ‚ŒใŸ้–ขๆ•ฐใฏใ€Œ้žๅŒๆœŸ้–ขๆ•ฐใ€ใซใชใ‚Šใ€await ใ‚’ไฝฟใฃใฆใ€Œๆญขใพใฃใฆใ‚‚ใ„ใ„ใ€ๅ‡ฆ็†ใ€‚
asyncio.gather(...) ใ‚’ไฝฟใ†ใจใ€่ค‡ๆ•ฐใฎๅ‡ฆ็†ใ‚’ไธฆๅˆ—ใซๅฎŸ่กŒใงใใ‚‹ใ€‚
ๅฎŸ่กŒใ‚ฟใ‚คใƒŸใƒณใ‚ฐใ‚„ๅพ…ใกๆ™‚้–“ (await asyncio.sleep(...)) ใซใ‚ˆใฃใฆๅ‡ฆ็†ใฎๅฎŒไบ†้ †ใŒๅค‰ใ‚ใ‚‹ใฎใงใ€้ †็•ชใŒไฟ่จผใ•ใ‚Œใชใ„็‚นใซๆณจๆ„ใŒๅฟ…่ฆใ€‚
ใ€Œ้ †็•ชใ‚’ๅฎˆใ‚ŠใŸใ„ใชใ‚‰ใƒซใƒผใƒ—๏ผ‹awaitใ€ใงๅ‡ฆ็†ใ€‚

๐Ÿ“ ใŠใ‚ใ‚Šใซ

้žๅŒๆœŸๅ‡ฆ็†ใฏใ€ๆœ€ๅˆใฏใจใฃใคใใซใใ„ใงใ™ใŒใ€ใ€Œๆ–™็†ใฎๅทฅ็จ‹ใฎใ‚ˆใ†ใซใ€ๅŒๆ™‚ใซๅ‹•ใ‹ใ™ใ‚‚ใฎใจ้ †็•ชใซใ‚„ใ‚‹ใ‚‚ใฎใŒใ‚ใ‚‹ใ€ใจ่€ƒใˆใ‚‹ใจใ€ๅฐ‘ใ—ใšใค็†่งฃใŒ้€ฒใ‚€ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?