MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Por que o PyGame congela quando usado em combinação com o PyMongo?


A exceção específica que você está encontrando parece estar relacionada à sua conexão mongo. Você consegue se conectar ao seu banco de dados no MongDB Compass?

De qualquer forma, sua arquitetura atual tornará seu loop de jogo dependente das gravações do banco de dados, o que pode levar um tempo significativo.

Eu criei um exemplo que usa um thread separado para gerenciar a conexão do MongoDB e se comunica com o thread principal usando uma fila. Este exemplo também inclui a taxa de quadros na barra de título e limita o loop do jogo a sessenta FPS. Se você adicionar isso ao seu script existente, deverá ver a queda da taxa de quadros sempre que ocorrer uma inserção no banco de dados.
import time
import threading
import queue
import pygame
import pymongo

# Thread for Database storage
class MongoThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.daemon = True

    def run(self):
        t_running = True
        client = pymongo.MongoClient("mongodb+srv://<insert-your-connection-string-here>")
        db = client.test
        c = db.scores
        while t_running:
            if self.queue.empty():
                time.sleep(0.1)
                pass
            else:
                data = self.queue.get()
                if data == "exit":
                    t_running = False
                else:
                    # do something with the queud data
                    c.insert_one(data)
                    print(c.count_documents({}))  # for debugging


WIDTH, HEIGHT = 1000, 400
FPS = 60

# create a queue to send commands from the main thread
q = queue.Queue()
# create and then start the thread
mongo_thread = MongoThread(q) 
mongo_thread.start()

pygame.init()
win = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
run = True
score = 0
while run:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            run = False
            q.put("exit")
        if e.type == pygame.KEYDOWN:
            # c.insert_one({"Score": score})
            q.put({"Score": score})

    score += 1
    win.fill((0, 0, 0))
    pygame.display.update()
    pygame.display.set_caption(f"FPS: {clock.get_fps():.1f}")
    clock.tick(FPS)
pygame.quit()