Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menjalankan dua fungsi async selama-lamanya dalam Python

Bagaimana untuk menjalankan dua fungsi async selama-lamanya dalam Python

WBOY
WBOYke hadapan
2023-09-21 21:25:021351semak imbas

Bagaimana untuk menjalankan dua fungsi async selama-lamanya dalam Python

Fungsi tak segerak, juga dikenali sebagai coroutine, ialah fungsi yang boleh dijeda dan disambung semula semasa pelaksanaan. Dalam Python, modul asyncio menyediakan rangka kerja yang berkuasa untuk menulis kod serentak menggunakan coroutine, yang merupakan fungsi khas yang boleh dijeda dan disambung semula. Dalam artikel ini, kami akan meneroka cara menjalankan dua fungsi tak segerak selama-lamanya menggunakan asyncio dalam Python.

Fungsi tak segerak

Fungsi tak segerak, juga dikenali sebagai coroutine, ialah fungsi yang boleh dijeda dan disambung semula semasa pelaksanaan. Mereka membenarkan pelaksanaan kod serentak tanpa menyekat utas utama, membolehkan penggunaan sumber sistem yang cekap.

Untuk menentukan fungsi tak segerak dalam Python, kami menggunakan kata kunci async sebelum pernyataan def. Dalam fungsi tak segerak, kita boleh menggunakan kata kunci await untuk menjeda pelaksanaan dan menunggu fungsi tak segerak atau coroutine yang lain selesai.

Kaedah 1 - Menggunakan modul asyncio

Modul asyncio dalam Python menyediakan rangka kerja untuk menulis kod serentak berbenang tunggal menggunakan coroutine, pemultipleksan akses I/O melalui soket dan sumber lain, menjalankan klien dan pelayan rangkaian, dan operasi lain yang berkaitan. Ia membolehkan kami menulis kod tak segerak dengan cara yang tersusun dan teratur.

Tatabahasa

Here, the asyncio.get_event_loop() function is used to retrieve the current event loop or create a new one if none exists.

Contoh

Dalam contoh function1 di bawah, kami mempunyai gelung tak terhingga yang mencetak "Fungsi 1" dan kemudian berhenti seketika selama 1 saat menggunakan await asyncio.sleep(1). Begitu juga, function2 mempunyai gelung tak terhingga yang mencetak "Fungsi 2" dan berhenti seketika selama 2 saat. Dengan memanggil asyncio.gather(function1(), function2()) dalam fungsi utama, kami mengarahkan gelung peristiwa untuk melaksanakan kedua-dua fungsi secara serentak. Fungsi asyncio.gather bertanggungjawab untuk menjadualkan dan menjalankan kedua-dua fungsi ini secara bersilang. Apabila kita menjalankan skrip Python, gelung acara berjalan tanpa had, berulang kali melaksanakan fungsi1 dan fungsi2. Output menunjukkan tingkah laku ini, dengan mesej daripada kedua-dua fungsi dicetak dalam cara bersilang berdasarkan selang masa masing-masing.

rreeee

Output

import asyncio

async def function1():
    while True:
        print("Function 1")
        await asyncio.sleep(1)  # Pause execution for 1 second

async def function2():
    while True:
        print("Function 2")
        await asyncio.sleep(2)  # Pause execution for 2 seconds

async def main():
    await asyncio.gather(function1(), function2())

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main())
    finally:
        loop.close()

Kaedah 1-Gunakan Benang

Benang adalah ringan dan membolehkan berbilang tugasan dilaksanakan serentak dalam satu proses. Dalam kaedah ini, kami akan menggunakan modul benang untuk menjalankan dua fungsi tak segerak selama-lamanya.

Tatabahasa

Function 1
Function 2
Function 1
Function 2
Function 1
Function 1
Function 2
Function 1
Function 1
.
.
.

Contoh

Dalam contoh di bawah, kami mempunyai dua fungsi tak segerak: async_function1 dan async_function2.

  • async_function1 menggunakan time.sleep(1) untuk mencetak "Fungsi Async 1" setiap saat.

  • async_function2 menggunakan time.sleep(2) untuk mencetak "Fungsi Async 2" setiap dua saat.

Kami mencipta dua utas, thread1 dan thread2, masing-masing untuk async_function1 dan async_function2. Kelas Thread dalam modul thread digunakan untuk mencipta dan mengurus thread. Kemudian kita mulakan dua utas menggunakan kaedah start(). Ini memulakan pelaksanaan fungsi tak segerak dalam utas berasingan, membolehkannya berjalan serentak.

thread1 = threading.Thread(target=async_function1)

Output

Keluaran contoh ini akan terus mencetak "Fungsi Async 1" setiap saat dan "Fungsi Async 2" setiap dua saat. Kod ini memulakan dua utas, setiap satu melaksanakan fungsi tak segeraknya sendiri. Benang utama dikekalkan hidup melalui gelung tak terhingga untuk membolehkan utas lain berjalan selama-lamanya.

import threading
import time

def async_function1():
    while True:
        print("Async function 1")
        time.sleep(1)

def async_function2():
    while True:
        print("Async function 2")
        time.sleep(2)

thread1 = threading.Thread(target=async_function1)
thread2 = threading.Thread(target=async_function2)

thread1.start()
thread2.start()

while True:
    pass

Kaedah 3 - Menggunakan Subproses

Subproses ialah proses bebas yang boleh dibuat dan diuruskan dalam program Python. Dalam kaedah ini, kami akan menggunakan modul subproses untuk menjalankan dua fungsi tak segerak selama-lamanya.

Tatabahasa

Async function 1
Async function 1
Async function 2
Async function 1
Async function 1
Async function 2
Async function 1
Async function 1
Async function 2

Di sini,

  • args (diperlukan): Parameter ini menentukan arahan yang akan dilaksanakan. Ia boleh menjadi rentetan atau urutan rentetan.

  • bufsize: Parameter ini mewakili saiz penimbal yang digunakan untuk operasi I/O. Nilai lalai ialah -1, yang bermaksud gunakan saiz penimbal lalai sistem.

  • bufsize: Parameter ini mewakili saiz penimbal yang digunakan untuk operasi I/O. Nilai lalai ialah -1, yang bermaksud gunakan saiz penimbal lalai sistem.

Contoh

Dalam contoh ini, kami mempunyai dua fungsi async yang sama: async_function1 dan async_function2.

  • async_function1 menggunakan time.sleep(1) untuk mencetak "Fungsi Async 1" setiap saat.

  • async_function2 menggunakan time.sleep(2) untuk mencetak "Fungsi Async 2" setiap dua saat.

Kami menggunakan kelas subproses.Popen dalam modul subproses untuk mencipta subproses dan bukannya benang. Setiap proses anak dicipta dengan melaksanakan proses Python berasingan yang menjalankan fungsi tak segerak yang sepadan. Subproses dibuat menggunakan subprocess.Popen constructor dan kami lulus arahan Python untuk melaksanakan fungsi yang diperlukan. Contohnya, ['python', '-c', 'from module import async_function1; async_function1()'] menjalankan async_function1 daripada proses Python yang berasingan.

subprocess.Popen(args, bufsize=-1, executable=None)

Output

Output contoh ini akan terus mencetak "Fungsi Async 1" setiap saat dan "Fungsi Async 2" setiap dua saat. Kod ini mencipta dua proses anak, masing-masing melaksanakan fungsi tak segeraknya sendiri. Proses utama dikekalkan hidup melalui gelung tak terhingga untuk membolehkan proses kanak-kanak berjalan selama-lamanya.

Async function 1
Async function 1
Async function 2
Async function 1
Async function 1
Async function 2
Async function 1
Async function 1
Async function 2

结论

在本文中,我们讨论了如何使用 Python 中的 asyncio 模块在 Python 中永久运行两个异步函数。使用 asyncio 进行异步编程为编写高性能和响应式 Python 应用程序开辟了新的可能性。通过利用异步函数和事件循环,您可以利用并发的力量并有效地管理多个任务。

Atas ialah kandungan terperinci Bagaimana untuk menjalankan dua fungsi async selama-lamanya dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam