我想使用StreamingPullFuture帶有 discordpy 的發布/訂閱訂閱來接收有關洗掉用戶和向不同服務器發送更新的說明。
理想情況下,我會在啟動 discordpy 服務器時啟動此功能:
@bot.event
async def on_ready():
print(f'{bot.user} {bot.user.id}')
await pub_sub_function()
我看了看,discord.ext.tasks但我認為這個用例不適合,因為我想動態地處理不規則間隔的事件。
我寫了這個pub_sub_function()(基于 pub/sub python 客戶端檔案)但它似乎沒有聽 pub/sub 或回傳任何東西:
def pub_sub_function():
subscriber_client = pubsub_v1.SubscriberClient()
# existing subscription
subscription = subscriber_client.subscription_path(
'my-project-id', 'my-subscription')
def callback(message):
print(f"pubsub_message: {message}")
message.ack()
return message
future = subscriber_client.subscribe(subscription, callback)
try:
future.result()
except KeyboardInterrupt:
future.cancel() # Trigger the shutdown.
future.result() # Block until the shutdown is complete.
有沒有人做過這樣的事情?是否有一種標準方法可以將資料/訊息從外部服務發送到 discordpy 服務器并異步收聽?
更新:我擺脫了pub_sub_function()并將代碼更改為:
subscriber_client = pubsub_v1.SubscriberClient()
# existing subscription
subscription = subscriber_client.subscription_path('my-project-id', 'my-subscription')
def callback(message):
print(f"pubsub_message: {message}")
message.ack()
return message
@bot.event
async def on_ready():
print(f'{bot.user} {bot.user.id}')
await subscriber_client.subscribe(subscription, callback).result()
這有點奏效,但現在await subscriber_client.subscribe(subscription, callback).result()阻止了 discord 機器人,并回傳了這個錯誤:
WARNING discord.gateway Shard ID None heartbeat blocked for more than 10 seconds.
Loop thread traceback (most recent call last):
uj5u.com熱心網友回復:
好的,所以這個Github pr非常有幫助。
在其中,用戶表示需要修改以使其與 asyncio 一起作業,因為谷歌的偽未來實作:
Google 實作了一個自定義的、偽未來
需要的猴子補丁,以使其與 asyncio 一起作業
但基本上,要使 pub/sub future 像 concurrent.futures.Future 一樣,discord.py 實作應該是這樣的:
async def pub_sub_function():
subscriber_client = pubsub_v1.SubscriberClient()
# existing subscription
subscription = subscriber_client.subscription_path('my-project-id', 'my-subscription')
def callback(message):
print(f"pubsub_message: {message}")
message.ack()
return message
future = subscriber_client.subscribe(subscription, callback)
# Fix the google pseduo future to behave like a concurrent Future:
future._asyncio_future_blocking = True
future.__class__._asyncio_future_blocking = True
real_pubsub_future = asyncio.wrap_future(future)
return real_pubsub_future
然后你需要等待這樣的功能:
@bot.event
async def on_ready():
print(f'{bot.user} {bot.user.id}')
await pub_sub_function()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534619.html
標籤:Google Cloud Collective 异步不和谐.py谷歌云发布订阅concurrent.futures
上一篇:從PHAssets生成影像時,iOS應用程式因記憶體問題而崩潰
下一篇:如何驗證屬性是唯一的?
