sql >> Databáze >  >> NoSQL >> MongoDB

Proč PyGame zamrzá při použití v kombinaci s PyMongem?

Zdá se, že konkrétní výjimka, se kterou se setkáváte, souvisí s vaším mongo připojením. Můžete se připojit ke své databázi v MongDB Compass?

V každém případě vaše současná architektura učiní vaši herní smyčku závislou na zápisech do databáze, což může trvat značnou dobu.

Vytvořil jsem příklad, který používá samostatné vlákno pro správu připojení MongoDB a komunikuje s hlavním vláknem pomocí fronty. Tento příklad také zahrnuje snímkovou frekvenci v záhlaví a omezuje herní smyčku na šedesát FPS. Pokud to přidáte do svého stávajícího skriptu, měli byste vidět pokles snímkové frekvence při každém vložení databáze.

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. Najděte počet všech překrývajících se intervalů

  2. Míchání PostgreSQL a MongoDB (jako backendy Django)

  3. MongoError:uživatel nemá povolení k akci

  4. Jak vyloučit jedno konkrétní pole z kolekce v Mongoose?