[英]What should i do to fix the NoSuchElementException error in my python code?
[英]Python code, should I thread? what to do?
我有这段代码,它通过套接字侦听命令“更新的播放列表”。 收到此命令后,它将知道数据库中的播放列表已更新,并连接到数据库并下载新的播放列表,然后开始播放这些文件。 我正在尝试找到有关此问题的最佳方法,因为当它获得命令后调用Media_Player函数时,它将在返回播放列表之前播放播放列表中的所有视频。
同时,如果发送了另一个“更新的播放列表”命令,则此命令的发送者将收到错误消息,因为该代码将不会监听。 我希望媒体播放器不停地播放,但是还必须不断地收听,以防被告知添加了新的播放列表。
然后,如果添加了新的播放列表,它将知道并且播放列表中的文件之一播放完毕后,可以切换到新的播放列表并继续播放。
我不知道该怎么做,我想我可以在一个过程中全部搞定,只为播放列表中的每个文件产生一个新线程,这样就可以直接回到聆听,但是如何我想知道线程何时完成,因为播放列表中的每个文件都有不同的长度。
同样在函数listen_serv()中看到“返回数据”行,这是否意味着由于返回而没有关闭连接?
# Echo server program
import socket
import time
import Database as DB
def listen_serv():
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.sendall('OK')
return data
conn.close()
while 1:
val= listen_serv()
if val=='Updated Playlist':
PlayList = DB.get_play_list()
Media_Player(PlayList)#This isnt implemented yet
您可能有两个运行的进程,一个是服务器,另一个是MediaPlayer,中间有一个队列。
服务器将命令推送到MediaPlayer弹出命令的队列中,在播放每个视频后,只需检查队列中是否有任何内容,是否有弹出内容并播放新的播放列表。
import socket
import time
import Database as DB
from multiprocessing import Process, Queue
def listen_serv(queue):
HOST = '' # Symbolic name meaning all available interfaces
PORT = 50007 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data:
break
conn.sendall('OK')
queue.put(data)
conn.close()
def media_player(queue):
while 1:
val = queue.get() # This will block until theres something on the queue.
if val == 'Updated Playlist':
PlayList = DB.get_play_list()
Media_Player(PlayList, queue) # Media_Player needs to check the queue and update when appropriate.
if __name__ == '__main__':
q = Queue()
server = Process(target = listen_serv, args = (q,))
media_player = Process(target = media_player, args = (q,))
server.start()
media_player.start()
server.join()
media_player.join()
您可以通过queue.empty()
检查队列是否为空,如果有抱歉的错误/问题,请确保那里有更好的实现。
祝好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.