Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 30, 2018 21:36:18

lordwader
Зарегистрирован: 2018-10-20
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

SQlite3 и многопоточность

Всем привет. Пытаюсь сделать многопоточное приложение, но все операции выполняются в одном потоке. Вот мой код:

 from threading import Thread
import random
from queue import Queue
import sqlite3
 
class SQL_db(Thread):
    def __init__(self, db):
        super().__init__()
        self.db=db
        self.reqs=Queue() 
        self.start()
        
    def run(self):
        cnx = sqlite3.Connection(self.db) 
        cursor = cnx.cursor()
        while True:
            req, arg, res = self.reqs.get()
            if req=='--close--':
                break
            cursor.execute(req, arg)
            if res:
                for rec in cursor:
                    res.put(rec)
                    cnx.commit()
                res.put('--no more--')
        cnx.close()
        
    def execute(self, req, arg=None, res=None):
        self.reqs.put((req, arg or tuple(), res))
        
    def select(self, req, arg=None):
        res=Queue()
        self.execute(req, arg, res)
        while True:
            rec=res.get()
            if rec=='--no more--':
                break
            yield rec
 
    def delete(self, req, arg = None):
        res=Queue()
        return self.execute(req, arg, res)
 
    def update(self, req, arg = None):
        res=Queue()
        return self.execute(req, arg, res)
            
    def close(self):
        self.execute('--close--')
 
if __name__=='__main__':
 
    db='people.db'
    sql = SQL_db(db)
    names = ['Ania', 'Natasha', 'Guido van Rossum', 'Kate', 'Papa John']
    sql.execute("create table if not exists people(name text, value real)")
    for i in range(5):
        name = random.choice(names)
        value = random.randrange(0, 10)
        sql.execute("insert into people values(?, ?)", (name, value))
    sql.delete("delete from people where value = 4")
    sql.update("update people set name = 'Kate' where name = 'Papa John'")
    for f, n in sql.select("select name, value from people where value = 1"):
        print (f, n)
    sql.close()
Подскажите пожалуйста, где я ошибся в коде? Заранее спасибо.

Офлайн

#2 Окт. 31, 2018 07:13:01

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

SQlite3 и многопоточность

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

Офлайн

#3 Окт. 31, 2018 11:08:27

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

SQlite3 и многопоточность

Я в принципе не увидел здесь много потоков. Где они?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version