为什么PyGame在与PyMongo结合使用时会冻结?



这个错误是什么,我不知道该怎么办…(PyMongo)。

Traceback (most recent call last):
File "C:/Users/aatif/Documents/Projects/Games with pygame/Space Invader/Game with DB.py", line 248, in <module>
play()
File "C:/Users/aatif/Documents/Projects/Games with pygame/Space Invader/Game with DB.py", line 23, in play
c.insert_one({'Score': 3})
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongocollection.py", line 698, in insert_one
self._insert(document,
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongocollection.py", line 613, in _insert
return self._insert_one(
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongocollection.py", line 602, in _insert_one
self.__database.client._retryable_write(
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongomongo_client.py", line 1497, in _retryable_write
with self._tmp_session(session) as s:
File "C:UsersaatifAppDataLocalProgramsPythonPython38-32libcontextlib.py", line 113, in __enter__
return next(self.gen)
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongomongo_client.py", line 1829, in _tmp_session
s = self._ensure_session(session)
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongomongo_client.py", line 1816, in _ensure_session
return self.__start_session(True, causal_consistency=False)
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongomongo_client.py", line 1766, in __start_session
server_session = self._get_server_session()
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongomongo_client.py", line 1802, in _get_server_session
return self._topology.get_server_session()
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongotopology.py", line 490, in get_server_session
self._select_servers_loop(
File "C:UsersaatifPycharmProjectspythonProject6venvlibsite-packagespymongotopology.py", line 215, in _select_servers_loop
raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: connection closed,connection closed,connection closed, Timeout: 30s, Topology Description: <TopologyDescription id: 600999bd9735fa26e13f796f, topology_type: ReplicaSetNoPrimary, servers: [<ServerDescription ('firstproject-shard-00-00.wy4pd.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('connection closed')>, <ServerDescription ('firstproject-shard-00-01.wy4pd.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('connection closed')>, <ServerDescription ('firstproject-shard-00-02.wy4pd.mongodb.net', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('connection closed')>]>

是我的服务器离线还是我做了一些错误的设置?下面是一个例子(很短,但同样的问题发生)

import pygame
from pymongo import MongoClient
# Eisa -> Username, LolLol65 -> Password
pygame.init()
win = pygame.display.set_mode((1000, 400))
run = True
cluster = MongoClient(
'mongodb+srv://USER:PASSWORD@firstproject.wy4pd.mongodb.net/Calculator?retryWrites=true&w=majority')
db = cluster['Game']
c = db['Scores']
score = 0
while run:
score += 1
win.fill((0, 0, 0))
for e in pygame.event.get():
if e.type == pygame.QUIT:
run = False
if e.type == pygame.KEYDOWN:
c.insert_one({'Score': score})
pygame.display.update()

(我添加代码是因为注释要求我这样做。这段代码再现了同样的问题,但我也可以添加完整的代码,如果它是更好的)

您遇到的特定异常似乎与您的mongo连接有关。你能连接到你的数据库在mongodb指南针?

在任何情况下,你当前的架构将使你的游戏循环依赖于数据库写入,这可能会花费大量时间。

我创建了一个示例,使用一个单独的线程来管理MongoDB连接,并使用队列与主线程通信。这个例子还包括标题栏中的帧率,并将游戏循环限制为60 FPS。如果将其添加到现有脚本中,则应该看到每当发生数据库插入时帧率下降。

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

最新更新