最近在学习生产者消费者模型,假如有如下需求:从某个网址读取 log ,提取出用户 id 然后发送邮件。在不涉及数据库操作的情况下,下面的示例代码(打不开 gist 只能贴在这里了。。)可以运行。
但现在问题来了,如果需要将每一次读取的 log 内容和发送记录都存储在数据库里,保证同一个 id 只收到一次,这个数据库操作应该放在哪个线程里面呢? 用的是 kennethreitz 大神的 records + Python 自带的 Sqlite3 ,尝试了在 2 个 Thread __init__
的时候分别连接同一个数据库文件,但是提示在一个线程内创建的连接不能在另一个线程内使用,这里有些迷惑。 Or 这个需求可以用另外的原理完成?
import threading
import time
import Queue
Q = Queue.Queue()
class ProducerThread(threading.Thread):
def __init__(self, out_q):
threading.Thread.__init__(self, name='Producer')
self.q = out_q
def run(self):
while True:
# 这里读取 log
log = getlog()
if log:
for each in log:
self.q.put(each)
else:
print('NO MORE LOG')
time.sleep(60)
class ConsumerThread(threading.Thread):
def __init__(self, out_q):
threading.Thread.__init__(self, name='Consumer')
self.q = out_q
def run(self):
while True:
# consume the data.
chunk = self.q.get()
print(u'开始发送...{0}'.format(chunk))
time.sleep(2) # 模拟发送
self.q.task_done()
def main():
t = ProducerThread(Q)
t.start()
c = ConsumerThread(Q)
c.start()
Q.join()
if __name__ == "__main__":
main()
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.