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.