sql >> データベース >  >> NoSQL >> MongoDB

PyMongoと組み合わせて使用​​するとPyGameがフリーズするのはなぜですか?

    発生している特定の例外は、mongo接続に関連しているようです。 MongDB Compassでデータベースに接続できますか?

    いずれにせよ、現在のアーキテクチャでは、ゲームループがデータベースの書き込みに依存するため、かなりの時間がかかる可能性があります。

    別のスレッドを使用してMongoDB接続を管理し、キューを使用してメインスレッドと通信する例を作成しました。この例では、タイトルバーにフレームレートも含まれており、ゲームループは60FPSに制限されています。これを既存のスクリプトに追加すると、データベースの挿入が発生するたびにフレームレートが低下するはずです。

    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. MongoDB.NETがアップサートで_idを生成しない

    2. 保存する前に影響を受けるマングース_id

    3. Meteorで別のコレクションに依存するコレクションの読み方

    4. MongoDBデータでMahoutRowSimilarityレコメンダーを実行する