我有一个python函数,每当我输入一个特定的数字时就会调用它。(回发函数,在flask上运行,并侦听传入的sms。
我还有一个函数,它有一个设定的时间表,每5分钟运行一次,从列表中读取并删除一些条目。
现在唯一的问题是这两个函数都是从同一个列表中读取的。
我担心当调度函数(每隔5分钟)被调用运行时,处理sms的回发函数也会被调用。它们同时运行,并且都试图同时从数组中读取。或者如果函数A从列表中读取,而函数B正在向列表写入。
这是我真正担心的问题吗?这两个函数可以同时调用吗?或者它们永远不会同时从相同的列表中读取。
我用芹菜研究了异步请求,但这并不能解决问题。每隔5分钟运行一次的函数仍然可以与celery函数被调用的时间完全相同,从而损坏列表。
谢谢,我只是糊涂了
发布于 2018-03-05 07:02:38
您的担忧是合理的,应该在代码中处理。
一般来说,列表在python中是线程安全的,但如果列表中的数据不是线程安全的,这仍然会导致问题,请参阅以下答案:
您描述的问题类型非常常见,根据您的需求,可以通过以下几种方式来解决:
1)使用锁来保护列表:Python threading. How do I lock a thread?
2)重新考虑方法,并将访问此特定列表的所有逻辑仅放入计时器中。然后,每当有短信进来时,你就把信息推入队列,并从队列中读取信息到计时器中。这会将两个线程解耦。来自另一个问题的示例(这个问题涉及另一个有趣的问题,但您可以只查看队列使用情况本身):Threading in python using queue
https://stackoverflow.com/questions/49101311
复制相似问题