Python 3.x 如何在多线程中插入Cassandra?

Python 3.x 如何在多线程中插入Cassandra?,python-3.x,cassandra,Python 3.x,Cassandra,我读了一个要插入卡桑德拉的大文件。 我试图创建一个Cassandra会话,并将其传递给多个线程。我希望所有线程使用相同的会话,以避免数千次重新连接 我发现池从不调用insert\u chunk函数,因为看不到日志记录。 知道为什么会话不能在线程中传递给吗? 我还尝试将session设置为全局而不是参数,可以调用insert_块,但被困在session.prepare def insert_chunk(chunk, session): logging.info("insert chunck

我读了一个要插入卡桑德拉的大文件。 我试图创建一个Cassandra会话,并将其传递给多个线程。我希望所有线程使用相同的会话,以避免数千次重新连接

我发现池从不调用insert\u chunk函数,因为看不到日志记录。 知道为什么会话不能在线程中传递给吗? 我还尝试将session设置为全局而不是参数,可以调用insert_块,但被困在session.prepare

def insert_chunk(chunk, session):
    logging.info("insert chunck started")
    prepared = session.prepare(...)
    for line in chunck:
       session.execute(prepared, values)


main():
        cluster = Cluster()
        session = cluster.connect()
        with open("BIG_JSON", mode="r") as _file:
            objects = ijson.items(_file, "item")
            with Pool(20) as pool:
                while True:
                    chunk = list(itertools.islice(objects, 10000))
                    if len(chunk) <= 0:
                        break
                    pool.apply_async(
                        insert_chunk,[chunk, session],
                    )
                pool.close()
                pool.join()
def insert_块(块,会话):
logging.info(“insert chunck start”)
准备=会话。准备(…)
对于chunck中的线路:
session.execute(已准备好,值)
main():
cluster=cluster()
session=cluster.connect()
打开(“BIG_JSON”,mode=“r”)作为_文件:
objects=ijson.items(_文件,“item”)
将池(20)作为池:
尽管如此:
chunk=list(itertools.islice(objects,10000))
如果len(chunk):

上面讨论的所有模式都可以使用多处理模块在多个进程上使用。多个进程将比多个线程更好,因此,如果高吞吐量是您的目标,请考虑此选项。 请确保永远不要跨多个进程共享任何群集、会话或响应未来对象。这些对象都应该在分叉过程之后而不是之前创建

和链接到

但是,如果您需要从一个巨大的JSON文件加载数据,那么我有另一个建议——使用DataStax(与DSE和Cassandra一起使用)。这个工具可以从JSON中读取数据,对于数据的加载和卸载进行了大量优化,并且在将数据从JSON映射到表方面非常灵活

有一系列关于其用法的博客帖子:


O。。感谢这很有帮助。