在python中侦听UDP数据包时出现问题套接字错误:[Errno 24]打开的文件太多

2024-10-02 04:25:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python比较陌生,我已经被这个问题困扰了一段时间了。在

基本上,我正在制作的模块将在游戏中使用(使用模块pygame),但是我不想使用pygame模块接收从键盘按下的键,而是希望通过UDP发送的网络接收这些键。在

我已经创建了一个模块,它将在一个单独的线程上监听已定义的UDP端口,并返回在游戏中需要调用的地方使用的按键。在

我编写的代码运行了一段时间,但是当它运行得非常慢时,我会收到以下错误消息:

Traceback (most recent call last):
  File "game.py", line 164, in <module>
  File "/usr/lib/python2.7/dist-packages/pygame/sprite.py", line 399, in update
  File "/home/globe/Desktop/Asteroids/sprites.py", line 41, in update
  File "/home/globe/Desktop/Asteroids/networkControlLatest.py", line 18, in getKeyPressed
  File "/home/globe/Desktop/Asteroids/networkControlLatest.py", line 8, in __init__
  File "/usr/lib/python2.7/socket.py", line 187, in __init__
socket.error: [Errno 24] Too many open files
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in apport_excepthook
ImportError: No module named fileutils

Original exception was:
Traceback (most recent call last):
  File "game.py", line 164, in <module>
  File "/usr/lib/python2.7/dist-packages/pygame/sprite.py", line 399, in update
  File "/home/globe/Desktop/Asteroids/sprites.py", line 41, in update
  File "/home/globe/Desktop/Asteroids/networkControlLatest.py", line 18, in getKeyPressed
  File "/home/globe/Desktop/Asteroids/networkControlLatest.py", line 8, in __init__
  File "/usr/lib/python2.7/socket.py", line 187, in __init__
socket.error: [Errno 24] Too many open files

在网络控制测试.py文件如下:

^{pr2}$

在中调用的示例游戏.py文件如下:

keys = networkControlLatest.getKeyPressed()
        if keys == 'A':
            laser = sprites.Bullet(screen,Ship.angle,Ship.rect.center)
            bulletgroup.add (pygame.sprite.Group(laser))
            delay = 15 

这个游戏用键盘很好的工作,所以我知道它的一些网络方面的问题,我只是无法在我的生活中弄清楚它到底是什么!任何帮助将不胜感激,我已经盯着这个代码太久了。。!在


Tags: 模块inpy游戏homelibusrline
1条回答
网友
1楼 · 发布于 2024-10-02 04:25:10

您将为保存的每个密钥使用一个新的套接字,然后运行一个线程来获取数据。 在线程中生成套接字并将数据写入队列,然后从队列中读取getkeyPresed()。在

我的2美分。在

编辑: 正如@cfi所说,你的问题主要是你从来没有在每次通话中关闭插座并启动新的插座。如果线程处于I/O等待状态,那么在多次按键之后,系统可用的文件描述符就会上升到极限,而python的GIL需要从一个线程移动到另一个线程,并等待GIL设置的操作数继续(包括)。 如果你想了解pytho线程在pytho中的改进,你应该如何使用pytho线程来管理它。 对于您的问题,您应该设置一个套接字并准备线程只接收数据。在

binarytides上有一个关于套接字的很好的教程和一个易于检查的线程示例

希望对你有帮助

相关问题 更多 >

    热门问题