2017-02-13 1 views
1

Ich habe ein Objekt, das viel mit elasticsearch und cassandra interagiert. Aber ich weiß nicht, wo ich meine Cassandra- und Elasticsearch-Sitzung instanziieren soll. Soll ich es in meinem „Code“, und übergeben Sie die Sitzung in einen Parameter meiner Funktion wie folgt aus:OOP Python: Wo instanziieren Cassandra und Elasticsearch Cluster?

cassandra_cluster = Cluster() 
session = cassandra_cluster.connect() 
es = Elasticsearch() 

class Article: 

    document_type = "cnn_article" 

    def __init__(self): 
     self.author = "" 
     self.url = "" 
     ... 

    @classmethod 
    def from_crawl(cls, url): 
     obj = cls() 
     # Launch a crawler and fill the fields and return the object 

    @classmethod 
    def from_elasticseacrh(cls, elastic_search_document): 
     obj = cls() 
     # Read the response from elasticsearch and return the object 

    def save_to_cassandra(self): 
     # Save an object into cassandra 
     session.execute(.....) 

    def save_to_elasticsearch(self, index_name, es): 
     # Save an object into elasticsearch 
     es.index(index=index_name, ...) 

    ... 

article = Article.from_crawl("http://cnn.com/article/blabla") 
article.save_to_cassandra(session) 
article.save_to_elasticsearch("cnn", es) 

Oder sollte ich die Instanziierung meiner cassandra und Elasticsearch Sitzung als Instanzvariablen wie folgt aus:

class Article: 

    cassandra_cluster = Cluster() 
    session = cassandra_cluster.connect() 
    es = Elasticsearch() 
    document_type = "cnn_article" 

    def __init__(self): 
     self.author = "" 
     self.url = "" 
     ... 

    @classmethod 
    def from_crawl(cls, url): 
     obj = cls() 
     # Launch a crawler and fill the fields and return the object 

    @classmethod 
    def from_elasticseacrh(cls, elastic_search_document): 
     obj = cls() 
     # Read the response from elasticsearch and return the object 

    def save_to_cassandra(self): 
     # Save an object into cassandra 
     session.execute(.....) 

    def save_to_elasticsearch(self): 
     # Save an object into elasticsearch 
     es.index(....) 

    ... 

article = Article.from_crawl("http://cnn.com/article/blabla") 
article.save_to_cassandra() 
article.save_to_elasticsearch() 

Antwort

2

auf der Grundlage ihrer Dokumentation und einige der Beispiele hier: http://www.datastax.com/dev/blog/datastax-python-driver-multiprocessing-example-for-improved-bulk-data-throughput

würde ich mit dem zweiten Ansatz gehen. Sie erwähnen, dass die Sitzung nur ein Kontextmanager zum Herunterfahren von Verbindungen ist, und ihre Abfragemanager zeigen sie als Klassenattribute an.

Ich denke, beide würden funktionieren, aber wenn Sie es multiprozessieren möchten, kann es marginal einfacher sein, wenn Sie es mit dem letzteren Ansatz tun.

Verwandte Themen