如何将异步线与Python中的其他线程一起运行?

发布于 2025-02-06 11:08:50 字数 1469 浏览 1 评论 0原文

我正在尝试与其他线程一起运行异步Run_forever。但是我只从永远的线程中获得输出,让我认为第二个线程甚至没有启动。

代码 - class.py:code

import asyncio

class Class1:
    def __init__(self):
        self.loop = asyncio.get_event_loop()

    async def _funcClass1(self):
        while True:
            await asyncio.sleep(5)
            print('Hello async/threading world')

    def funcClass1(self):
        asyncio.ensure_future(self._funcClass1())
        self.loop.run_forever()

class Class2:
    def __init__(self):
        self.loop = asyncio.get_event_loop()
    
    async def _funcClass2(self, name):
        print(f'Hello {name}')
    
    def funcClass2(self):
        self.loop.run_until_complete(self._funcClass2())

-main.py:

from Classes import Class1, Class2
import threading
import asyncio

class1 = Class1()
class2 = Class2()

if __name__ == "__main__":
    t1 = threading.Thread(target=asyncio.run, args=(class1.funcClass1(), ))
    t2 = threading.Thread(target=class2.funcClass2, args=('john', ))

    t1.start()
    t2.start()

    t1.join()
    t2.join()

输出:

Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world

I'm trying to run an async run_forever together with other threads. But I only get output from the forever thread, making me think that the second thread doesn't even start.

Code - Classes.py:

import asyncio

class Class1:
    def __init__(self):
        self.loop = asyncio.get_event_loop()

    async def _funcClass1(self):
        while True:
            await asyncio.sleep(5)
            print('Hello async/threading world')

    def funcClass1(self):
        asyncio.ensure_future(self._funcClass1())
        self.loop.run_forever()

class Class2:
    def __init__(self):
        self.loop = asyncio.get_event_loop()
    
    async def _funcClass2(self, name):
        print(f'Hello {name}')
    
    def funcClass2(self):
        self.loop.run_until_complete(self._funcClass2())

Code - main.py:

from Classes import Class1, Class2
import threading
import asyncio

class1 = Class1()
class2 = Class2()

if __name__ == "__main__":
    t1 = threading.Thread(target=asyncio.run, args=(class1.funcClass1(), ))
    t2 = threading.Thread(target=class2.funcClass2, args=('john', ))

    t1.start()
    t2.start()

    t1.join()
    t2.join()

Output:

Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world
Hello async/threading world

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

回首观望 2025-02-13 11:08:50

在播放@danangjoyoo的答案之后。我想到了这一点(两个功能都需要以target = asyncio.run>):

class.py.py

import asyncio

class Class1:
    def __init__(self):
        self.loop = asyncio.get_event_loop()

    async def _funcClass1(self):
        while True:
            await asyncio.sleep(5)
            print('Hello async/threading world')

    def funcClass1(self):
        asyncio.ensure_future(self._funcClass1())

class Class2:
    def __init__(self):
        self.loop = asyncio.get_event_loop()
    
    async def _funcClass2(self, name):
        print(f'Hello {name}')
    
    def funcClass2(self, name):
        asyncio.ensure_future(self._funcClass2(name))

main.py.py

from Classes import Class1, Class2
import threading
import asyncio

class1 = Class1()
class2 = Class2()

if __name__ == "__main__":
    t1 = threading.Thread(target=asyncio.run, args=(class1.funcClass1()))
    t2 = threading.Thread(target=asyncio.run, args=(class2.funcClass2('john')))

    class1.loop.run_forever()
    class2.loop.run_until_complete()

    t1.start()
    t2.start()

    t1.join()
    t2.join()

After playing around with the answer of @danangjoyoo. I came up with this (both functions need to be executed as target=asyncio.run):

classes.py:

import asyncio

class Class1:
    def __init__(self):
        self.loop = asyncio.get_event_loop()

    async def _funcClass1(self):
        while True:
            await asyncio.sleep(5)
            print('Hello async/threading world')

    def funcClass1(self):
        asyncio.ensure_future(self._funcClass1())

class Class2:
    def __init__(self):
        self.loop = asyncio.get_event_loop()
    
    async def _funcClass2(self, name):
        print(f'Hello {name}')
    
    def funcClass2(self, name):
        asyncio.ensure_future(self._funcClass2(name))

main.py:

from Classes import Class1, Class2
import threading
import asyncio

class1 = Class1()
class2 = Class2()

if __name__ == "__main__":
    t1 = threading.Thread(target=asyncio.run, args=(class1.funcClass1()))
    t2 = threading.Thread(target=asyncio.run, args=(class2.funcClass2('john')))

    class1.loop.run_forever()
    class2.loop.run_until_complete()

    t1.start()
    t2.start()

    t1.join()
    t2.join()
七月上 2025-02-13 11:08:50

run_forever()将阻止代码的下一行。

运行第二个线程

class.py

import asyncio

class Class1:
    def __init__(self):
        self.loop = asyncio.get_event_loop()

    async def _funcClass1(self):
        while True:
            await asyncio.sleep(5)
            print('Hello async/threading world')

    def funcClass1(self):
        asyncio.ensure_future(self._funcClass1())

class Class2:
    def __init__(self):
        self.loop = asyncio.get_event_loop()
    
    async def _funcClass2(self, name):
        print(f'Hello {name}')
    
    def funcClass2(self):
        self.loop.run_until_complete(self._funcClass2())

main.py.py之后,请尝试将其放置。

from Classes import Class1, Class2
import threading
import asyncio

class1 = Class1()
class2 = Class2()

if __name__ == "__main__":
    t1 = threading.Thread(target=asyncio.run, args=(class1.funcClass1(), ))
    t2 = threading.Thread(target=class2.funcClass2, args=('john', ))

    t1.start()
    t2.start()

    class1.loop.run_forever()

    t1.join()
    t2.join()

run_forever() will block the next lines of code.

try to put it after running the 2nd thread

classes.py

import asyncio

class Class1:
    def __init__(self):
        self.loop = asyncio.get_event_loop()

    async def _funcClass1(self):
        while True:
            await asyncio.sleep(5)
            print('Hello async/threading world')

    def funcClass1(self):
        asyncio.ensure_future(self._funcClass1())

class Class2:
    def __init__(self):
        self.loop = asyncio.get_event_loop()
    
    async def _funcClass2(self, name):
        print(f'Hello {name}')
    
    def funcClass2(self):
        self.loop.run_until_complete(self._funcClass2())

main.py

from Classes import Class1, Class2
import threading
import asyncio

class1 = Class1()
class2 = Class2()

if __name__ == "__main__":
    t1 = threading.Thread(target=asyncio.run, args=(class1.funcClass1(), ))
    t2 = threading.Thread(target=class2.funcClass2, args=('john', ))

    t1.start()
    t2.start()

    class1.loop.run_forever()

    t1.join()
    t2.join()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文