2016-04-20 18 views
0

Stack: python3.4, PostgreSQL 9.4.7, 2.8.0 peewee, psycopg2 2.6.1 (dt Dezember PQ3 ext lo64)Python peewee Multiprozessing Pool Fehler

Ich habe ein Bedürfnis sprechen zu können (wählen , fügt, update) in die postgresql-Datenbank in jedem Worker ein. Ich benutze Pythons Multiprocessing-Pool, um 10 Arbeiter zu erstellen, und jeder macht einen Curl-Aufruf und redet dann basierend auf dem, was er findet, mit der Datenbank.

Nachdem ich ein paar Threads im Internet gelesen hatte, dachte ich, ein Verbindungspool wäre der richtige Weg. Also habe ich den folgenden Code auf meine models.py-Datei gelegt. Ich habe meine Zweifel über Verbindungen Pools, weil mein Verständnis ist, dass die Wiederverwendung von Datenbankverbindungen über Threads ist ein Nein Nein.

db = PooledPostgresqlExtDatabase(
    'uc', 
    max_connections=32, 
    stale_timeout=300, # 5 minutes. 
    **{'password': cfg['psql']['pass'], 
     'port': cfg['psql']['port'], 
     'register_hstore':False, 
     'host': cfg['psql']['host'], 
     'user': cfg['psql']['user']}) 

Auf die Frage jetzt. Ich bekomme zufällige SQL-Fehler, wenn ich von einigen Arbeitern mit der Datenbank rede. Bevor ich peewee in den Mix einführte, benutzte ich die "psycopg2" -Bibliothek ohne einen Wrapper. Ich habe auch eine neue Datenbankverbindung pro Arbeiter erstellt. Es gab keine Fehler.

Eine Probe Fehler, die ich erhalte, sind:

multiprocessing.pool.RemoteTraceback: 
""" 
Traceback (most recent call last): 
    File "/usr/local/lib/python3.4/dist-packages/playhouse/postgres_ext.py", line 377, in execute_sql 
    self.commit() 
    File "/usr/local/lib/python3.4/dist-packages/peewee.py", line 3468, in commit 
    self.get_conn().commit() 
psycopg2.DatabaseError: error with no message from the libpq 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/usr/lib/python3.4/multiprocessing/pool.py", line 119, in worker 
    result = (True, func(*args, **kwds)) 
    File "/usr/lib/python3.4/multiprocessing/pool.py", line 44, in mapstar 
    return list(map(*args)) 
    File "/home/dan/dev/link-checker/crawler/manager.py", line 17, in startWorker 
    wrk.perform() 
    File "/home/dan/dev/link-checker/crawler/worker.py", line 49, in perform 
    self.pullUrls() 
    File "/home/dan/dev/link-checker/crawler/worker.py", line 63, in pullUrls 
    newUrlDict = UrlManager.createUrlWithInProgress(self._url['crawl'], source_url, self._url['base']) 
    File "/home/dan/dev/link-checker/crawler/models.py", line 152, in createUrlWithInProgress 
    newUrl = Url.create(**newUrlDict) 
    File "/usr/local/lib/python3.4/dist-packages/peewee.py", line 4494, in create 
    inst.save(force_insert=True) 
    File "/usr/local/lib/python3.4/dist-packages/peewee.py", line 4680, in save 
    pk_from_cursor = self.insert(**field_dict).execute() 
    File "/usr/local/lib/python3.4/dist-packages/peewee.py", line 3213, in execute 
    cursor = self._execute() 
    File "/usr/local/lib/python3.4/dist-packages/peewee.py", line 2628, in _execute 
    return self.database.execute_sql(sql, params, self.require_commit) 
    File "/usr/local/lib/python3.4/dist-packages/playhouse/postgres_ext.py", line 377, in execute_sql 
    self.commit() 
    File "/usr/local/lib/python3.4/dist-packages/peewee.py", line 3285, in __exit__ 
    reraise(new_type, new_type(*exc_args), traceback) 
    File "/usr/local/lib/python3.4/dist-packages/peewee.py", line 127, in reraise 
    raise value.with_traceback(tb) 
    File "/usr/local/lib/python3.4/dist-packages/playhouse/postgres_ext.py", line 377, in execute_sql 
    self.commit() 
    File "/usr/local/lib/python3.4/dist-packages/peewee.py", line 3468, in commit 
    self.get_conn().commit() 
peewee.DatabaseError: error with no message from the libpq 

ich tailed auch die postgresql-Datei und das ist, was ich sah:

2016-04-19 20:34:23 EDT [26824-3] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:34:23 EDT [26824-4] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:34:23 EDT [26824-5] [email protected] WARNING: there is no transaction in progress 
2016-04-19 20:34:23 EDT [26824-6] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:34:23 EDT [26824-7] [email protected] WARNING: there is no transaction in progress 
2016-04-19 20:34:23 EDT [26824-8] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:34:23 EDT [26824-9] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:35:14 EDT [26976-1] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:35:14 EDT [26976-2] [email protected] WARNING: there is no transaction in progress 
2016-04-19 20:35:14 EDT [26976-3] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:35:14 EDT [26976-4] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:35:14 EDT [26976-5] [email protected] WARNING: there is no transaction in progress 
2016-04-19 20:35:14 EDT [26976-6] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:35:14 EDT [26976-7] [email protected] WARNING: there is no transaction in progress 
2016-04-19 20:35:14 EDT [26976-8] [email protected] WARNING: there is already a transaction in progress 
2016-04-19 20:35:14 EDT [26976-9] [email protected] WARNING: there is no transaction in progress 

Meine Vermutung ist, dass die Verbindung Pool und der Multiprozessing don geh nicht gut zusammen. Hat jemand das erfolgreich ohne Fehler gemacht und wenn ja, können Sie mich auf ein Beispiel hinweisen oder mir einen Rat geben, der funktioniert?

Muss ich explizit eine neue Verbindung mit peewee in meinem Worker erstellen oder gibt es einen einfacheren Weg, peewee mit der Multiprocessing-Pool-Bibliothek zu verwenden.

Danke für Ihre Antworten und zum Lesen.

Antwort

Verwandte Themen