gpt4 book ai didi

Python 代码,我应该线程化吗?该怎么办?

转载 作者:太空宇宙 更新时间:2023-11-03 19:17:11 24 4
gpt4 key购买 nike

我有这段代码,它通过套接字监听“更新播放列表”命令。当它收到此命令时,它知道数据库中的播放列表已更新,并且它连接到数据库并下载新的播放列表,然后开始播放这些文件。我正在尝试找到最好的方法,因为当它获取命令,然后调用 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()检查队列是否为空我确信有更好的实现,如果有错误/问题,我深表歉意。

祝你好运。

关于Python 代码,我应该线程化吗?该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com