通过Python多处理队列执行cassandra插入查询

时间:2015-06-01 05:00:55

标签: python cassandra queue multiprocessing

我有一个cassandra键空间sujata。我使用python驱动程序cassandra.cluster连接到cassandra。sujata的列系列是hello。 以下是我的代码: -

from multiprocessing import Process,Queue
from cassandra.cluster import Cluster
import os
queue=Queue()
cluster = Cluster(['127.0.0.1'])
metadata = cluster.metadata
session = cluster.connect("sujata")

def hi():
    global session
    global queue
    while True:
        y=queue.get()
        if y=="exit":
            os._exit(0)    
        else:
            print y
            session.execute(y)

if __name__=="__main__":
    x=Process(target=hi)
    x.start()
    for i in xrange(10):
        z="INSERT into hello(name) VALUES('" + str(i) + "');"
        queue.put(z)
        if i==9:
            queue.put("exit")
    session.cluster.shutdown()
    session.shutdown()

在表中,我有一个列name,我要插入i的值。插入查询通过队列传递。我能够获取队列的内容。当我运行上面的代码,输出是: -

INSERT into hello(name) VALUES('0');

session.execute()无效。 我无法理解为什么会这样。

1 个答案:

答案 0 :(得分:0)

我没有cassandra机器,但我想,一旦你将连接部分移动到prcoess函数hi(),它就会工作。像:

def hi():
    cluster = Cluster(['127.0.0.1'])
    metadata = cluster.metadata
    session = cluster.connect("sujata")
    global queue
    while True:
        y=queue.get()
        if y=="exit":
            os._exit(0)    
        else:
            print y
            session.execute(y)

不知道为什么它会像这样,但我看到global变量在新流程中表现得很奇怪。

这不是我猜的最佳方法。因为每次它都连接到同一个冗余且需要关闭的数据库。我希望可能有更好的答案。

编辑1:

我没有正确阅读代码。您正在使用queue。因此,流程hi将仅启动一次,并且queue用于在流程之间进行通信。因此,与数据库的连接也只是一次。您不需要在主进程中建立数据库连接。因此,将该部分转移到多进程函数是最好的方法。