Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python代码,我应该线程吗?怎么办?_Python_Multithreading_Sockets - Fatal编程技术网

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

Python代码,我应该线程吗?怎么办?,python,multithreading,sockets,Python,Multithreading,Sockets,我有这个代码,它通过套接字监听命令“更新的播放列表”。 当它收到这个命令时,它知道数据库中的播放列表已经更新,它连接到数据库并下载新的播放列表,然后开始播放这些文件。 我正试图找到最好的方法,因为当它收到命令,然后调用Media_Player函数时,它将播放播放列表中的所有视频,然后再返回以收听套接字 同时,如果发送了另一个“更新的播放列表”命令,则此命令的发送者将收到一个错误,因为此代码将不会被侦听。我希望媒体播放器不停地播放,但它也必须不断地收听,以防有人告诉它添加了新的播放列表 然后,如果

我有这个代码,它通过套接字监听命令“更新的播放列表”。 当它收到这个命令时,它知道数据库中的播放列表已经更新,它连接到数据库并下载新的播放列表,然后开始播放这些文件。 我正试图找到最好的方法,因为当它收到命令,然后调用Media_Player函数时,它将播放播放列表中的所有视频,然后再返回以收听套接字

同时,如果发送了另一个“更新的播放列表”命令,则此命令的发送者将收到一个错误,因为此代码将不会被侦听。我希望媒体播放器不停地播放,但它也必须不断地收听,以防有人告诉它添加了新的播放列表

然后,如果添加了新的播放列表,它将知道,当播放列表中的一个文件播放完毕时,它可以切换到新的播放列表并继续播放

我不知道该怎么做,我想我可以在一个进程中完成这一切,只需为播放列表中的每个文件生成一个新线程,这样它就可以直接返回到侦听,但是我怎么知道线程何时完成,因为播放列表中的每个文件都将是不同的长度

在函数listen_serv()中,请参见“return data”一行,这是否意味着它不会因为返回而关闭连接

# 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()
我确信有更好的实现,如果有错误/问题,我道歉


祝您好运。

您可以运行两个进程,一个是服务器,另一个是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()
我确信有更好的实现,如果有错误/问题,我道歉


祝你好运。

虽然我全力支持基本的实施策略,但有几件事需要解决。listen\u serv()需要围绕.accept()调用增加一个while语句。父进程需要捕获键盘中断,或者使用其他方法干净地离开。媒体播放器几乎不需要访问队列;调用函数就是这么做的。我同意,我没有实现一种干净的方法来终止每个进程,你可以简单地在队列中添加一个命令,告诉每个进程终止,比如“退出”,至于第二个问题,“当播放列表中的一个文件播放完后,它可以切换到新的播放列表并继续播放”所以媒体播放器需要监控队列,以知道何时加载新的播放列表…所以我可以做的是让媒体播放器在播放文件之间检查队列并相应更新。如果我将媒体播放器设置为检查数据库中的标志,或者甚至检查文件是否存在,这也不会有什么不同吗?我想我找到了一种更简单的使用线程的方法。如果生成两个线程,一个是侦听服务器,一个是媒体播放器。我使用threading.Event()。这样,当listen服务器获得它的命令时,它就会设置事件。然后,媒体播放器可以看到这一点,然后可以从数据库更新其播放列表。这是一种好方法吗?threading.Event()非常原始。还请注意,python中的线程不是真正的多线程,因为python具有全局解释器锁,但多处理并没有这个问题,但我怀疑您需要担心,使用队列是最灵活的方法,因为它们是线程安全的,如果您想使用threading.Event()函数,您可以将多个类型推入并在检索值时阻塞,这似乎有点有限。虽然我全力支持基本的实现策略,但仍有一些问题需要解决。listen\u serv()需要围绕.accept()调用增加一个while语句。父进程需要捕获键盘中断,或者使用其他方法干净地离开。媒体播放器几乎不需要访问队列;调用函数就是这么做的。我同意,我没有实现一种干净的方法来终止每个进程,你可以简单地在队列中添加一个命令,告诉每个进程终止,比如“退出”,至于第二个问题,“当播放列表中的一个文件播放完后,它可以切换到新的播放列表并继续播放”所以媒体播放器需要监控队列,以知道何时加载新的播放列表…所以我可以做的是让媒体播放器在播放文件之间检查队列并相应更新。如果我将媒体播放器设置为检查数据库中的标志,或者甚至检查文件是否存在,这也不会有什么不同吗?我想我找到了一种更简单的使用线程的方法。如果生成两个线程,一个是侦听服务器,一个是媒体播放器。我使用threading.Event()。这样,当listen服务器获得它的命令时,它就会设置事件。然后,媒体播放器可以看到这一点,然后可以从数据库更新其播放列表。这是一种好方法吗?threading.Event()非常原始。还请注意,python中的线程不是真正的多线程,因为python具有全局解释器锁,但多处理并没有这个问题,但我怀疑您需要担心,使用队列是最灵活的方法,因为它们是线程安全的,如果您想使用threading.Event()函数,那么您可以将多个类型推入并在检索值时阻塞,这似乎有点有限