2016-04-20 7 views
0

Stack: python3.4, PostgreSQL 9.4.7, 2.8.0 PeeWee, psycopg2 2.6.1 (дт разл PQ3 доб lo64)питон ошибка PeeWee многопроцессорной бассейн

У меня есть потребность быть в состоянии говорить (выберите , вставляет, обновляют) в базу данных postgresql у каждого работника. Я использую пул многопроцессорности pythons, чтобы создать 10 рабочих, и каждый из них делает завиток, а затем разговаривает с базой данных на основе того, что он находит.

После прочтения нескольких потоков в интернетах я думал, что пул соединений - это путь. Поэтому я поставил код ниже поверх моего файла models.py. У меня есть сомнения в пулах соединений, потому что я понимаю, что повторное использование соединений с базами данных по потокам - это нет.

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']}) 

На данный момент. Я получаю случайные ошибки sql при разговоре с базой данных у некоторых работников. Прежде чем я представил peewee в микс, я использовал библиотеку psycopg2 без оболочки. Я также создавал новое подключение к базе данных для каждого работника. Ошибок не было.

ошибка выборки, что я получаю:

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 

Я также хвостатые файл PostGreSQL и это то, что я видел:

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 

Подозреваю, что пул соединений и многопроцессорных дон «Хорошо вместе. Кто-нибудь сделал это успешно без ошибок, и если да, можете ли вы указать мне пример или дать мне совет, который работает?

Нужно ли мне явно создавать новое соединение с peewee внутри моего работника или есть более простой способ использования peewee с библиотекой пула многопроцессорности.

Спасибо за ваши ответы и за чтение.

ответ