MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Pourquoi PyGame se fige-t-il lorsqu'il est utilisé en combinaison avec PyMongo ?

L'exception spécifique que vous rencontrez semble être liée à votre connexion mongo. Pouvez-vous vous connecter à votre base de données dans MongDB Compass ?

Dans tous les cas, votre architecture actuelle rendra votre boucle de jeu dépendante des écritures de la base de données, ce qui pourrait prendre un temps considérable.

J'ai créé un exemple qui utilise un thread séparé pour gérer la connexion MongoDB et communique avec le thread principal à l'aide d'une file d'attente. Cet exemple inclut également la fréquence d'images dans la barre de titre et limite la boucle de jeu à soixante FPS. Si vous ajoutez cela à votre script existant, vous devriez voir la fréquence d'images chuter chaque fois qu'une insertion de base de données se produit.

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()