sql >> Databasteknik >  >> NoSQL >> MongoDB

Varför fryser PyGame när det används i kombination med PyMongo?

Det specifika undantaget du stöter på verkar vara relaterat till din mongo-anslutning. Kan du ansluta till din databas i MongDB Compass?

I vilket fall som helst kommer din nuvarande arkitektur att göra din spelloop beroende av databasens skrivningar, vilket kan ta lång tid.

Jag har skapat ett exempel som använder en separat tråd för att hantera MongoDB-anslutningen och kommunicerar med huvudtråden med hjälp av en kö. Det här exemplet inkluderar också bildfrekvensen i titelfältet och begränsar spelslingan till sextio FPS. Om du lägger till det i ditt befintliga skript bör du se bildhastigheten sjunka varje gång en databas infogas.

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



  1. return Model.create(arr).exec() fungerar inte i mongoose

  2. Hur löser man TypeError:callback.apply är inte en funktion?

  3. Hitta ett dokument med ObjectID i mongoDB

  4. Fel:querySrv ENODATA _mongodb._tcp.blog-cluster-0hb5z.mongodb.net på QueryReqWrap.onresolve [as oncomplete]