perf(bot): ⚡ Use one process per shard.
Start one process per shard and initialize a new one if any of them fails.
This commit is contained in:
@@ -1,5 +1,51 @@
|
||||
from payphone import bot
|
||||
from payphone.core import config
|
||||
def shard(shard_id: int, shard_count: int) -> None:
|
||||
"""Starts a new shard.
|
||||
|
||||
Args:
|
||||
shard_id (int): The shard's ID.
|
||||
shard_count (int): The total amount of shards.
|
||||
"""
|
||||
|
||||
from payphone.bot import bot
|
||||
from payphone.core import config
|
||||
|
||||
bot.shard_ids = [shard_id]
|
||||
bot.shard_count = shard_count
|
||||
|
||||
bot.run(config.TOKEN)
|
||||
|
||||
|
||||
bot.bot.run(config.TOKEN)
|
||||
if __name__ == "__main__":
|
||||
import multiprocessing as mp
|
||||
|
||||
import time
|
||||
|
||||
import httpx
|
||||
|
||||
from payphone.core import config
|
||||
|
||||
response = httpx.get(
|
||||
"https://discord.com/api/v10/gateway/bot",
|
||||
headers={"Authorization": f"Bot {config.TOKEN}"},
|
||||
)
|
||||
|
||||
info = response.json()
|
||||
|
||||
shard_count = info["shards"]
|
||||
|
||||
ps: list[mp.Process] = [
|
||||
mp.Process(target=shard, args=(i, shard_count)) for i in range(shard_count)
|
||||
]
|
||||
|
||||
for p in ps:
|
||||
p.start()
|
||||
|
||||
time.sleep(5)
|
||||
|
||||
while True:
|
||||
for i in range(shard_count):
|
||||
if not ps[i].is_alive():
|
||||
ps[i] = mp.Process(target=shard, args=(i, shard_count))
|
||||
ps[i].start()
|
||||
|
||||
time.sleep(5)
|
||||
|
||||
Reference in New Issue
Block a user