2017-02-21 60 views
0

Я пытаюсь создать программу с 3 процессами, которые читаются из одной базы данных. Код работал до того, как я начал внедрять процессы.MemoryError при запросе базы данных из процесса

Я получаю MemoryError при выполнении select() от PeeWee, я подозреваю, что что-то не так с совместным использованием ресурсов. Минимальный пример:

models.py

from playhouse.pool import PooledSqliteExtDatabase 

file_scanner_database = PooledSqliteExtDatabase(
    None, 
    max_connections=32, 
) 

class FileModel(Model): 
    class Meta: 
     database = file_scanner_database 

main.py

from file_scanner import FileScanner 
from models import file_scanner_database 
from models import FileModel 
from multiprocessing import Process 

def create_scanner_agent(data): 
    scanner = FileScanner(data) 
    scanner.start_scanner() 

shared_info = {'db_location': '/absolute/path/to/database'} 

file_scanner_database.init(shared_info['db_location']) 
file_scanner_database.connect() 
file_scanner_database.create_tables([FileModel], safe=True) 

new_process = Process(
    target=create_scanner_agent, 
    args=(shared_info,) 
) 
new_process.daemon = True 
new_process.start() 

try: 
    new_process.join() 
except KeyboardInterrupt: 
    pass 

new_process.terminate() 

file_scanner.py

from models import file_scanner_database 
from models import FileModel 

class FileScanner: 
    def __init__(self, data): 
     for k, v in data.items(): 
      setattr(self, k, v) 

     file_scanner_database.init(self.db_location) 
     file_scanner_database.connect() 

    def start_scanner(self): 
     while True: 
      # THIS IS WHERE THE PROGRAM CRASHES 
      for row in FileModel.select(): 
       ... 
+0

Если я использую 'Thread', вместо этого он работает. –

ответ

0

It похоже, вы пытаетесь получить доступ к памяти через вилку? Или какое-то такое безумие? Я думаю, что ответ заключается в том, что вы делаете это неправильно. Попробуйте открыть соединение с БД после вилки.

+0

Я пытаюсь получить доступ к одному и тому же файлу Sqlite через fork, но * не * используя одно и то же соединение с БД. Первое соединение служит для создания таблиц, когда это необходимо, и подпроцессы затем инициализируют свои собственные соединения и используют один и тот же БД. Закрытие соединения перед форкированием не имеет значения, поэтому есть некоторый ресурс, который остается открытым. Я понял, что для его работы я должен только инициализировать соединения после форкирования, но я не совсем понимаю, почему это необходимо, когда используются отдельные соединения. Попытка с 'sqlalchemy' и' sqlite3' показывает, что это, вероятно, идет глубже, чем pw. –