【发布时间】:2018-06-19 07:33:08
【问题描述】:
我正在尝试并行化我的工作,但我是多线程新手,所以对具体的实现感到困惑。
我有一个套接字侦听器,它将数据保存到缓冲区。当缓冲区达到他的容量时,我需要将其数据保存到数据库中。 在一个线程上我想启动套接字侦听器,而在并行任务上我想检查缓冲区状态。
BufferQueue 只是 python list 的扩展,具有允许检查列表是否达到指定大小的方法。
SocketManager 是我正在收听的STREAM_URL 的流数据提供者。它使用回调函数来处理消息
但是当我使用回调来检索数据时,我不确定使用共享变量是否是正确且最佳的决定
buffer = BufferQueue(buffer_size=10000)
def start_listening_to_sokcet(client):
s = SocketManager(client)
s.start_socket(cb_new)
s.start()
def cb_new(message):
print("New message")
global buffer
for m in message:
#save data to buffer
def is_buffer_ready(buffer):
global buffer
print("Buffer state")
if buffer.ready():
#save buffer data to db
如果您能帮我解决这个问题,我将不胜感激
【问题讨论】:
-
您可以使用该共享缓冲区,但您需要一些方法来控制对它的访问,以便一次只有一个线程可以修改它。例如,您可以使用
Lock。 -
不知道这些
BufferQueue、SocketManager等类型来自哪里,或者至少它们做了什么,很难提供任何不是很模糊的东西。但是我会警惕任何使用is_buffer_ready函数的API,调用者必须定期检查(或者更糟糕的是,在自旋循环中);通常你会想要一些你可以阻止的东西。 -
如果您可以给我们minimal reproducible example,我们可能会提出比“您可能需要在此处锁定”和“通常您希望通过某种方式阻止那里”更具体的想法……
-
@abarnert 感谢您的建议。我编辑了我的问题
标签: python multithreading sockets websocket multiprocessing