我有一个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()无效。 我无法理解为什么会这样。
答案 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
用于在流程之间进行通信。因此,与数据库的连接也只是一次。您不需要在主进程中建立数据库连接。因此,将该部分转移到多进程函数是最好的方法。