Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.python > #3344

Multythread et Queue en Python

From Stephane Tougard <stephane@sdf.org>
Newsgroups fr.comp.lang.python
Subject Multythread et Queue en Python
Date 2020-05-14 09:24 +0000
Organization Aioe.org NNTP Server
Message-ID <r9j2o8$1iql$1@gioia.aioe.org> (permalink)

Show all headers | View raw


Bonjour,

J'ai un programme multi-threadé en Python qui parle avec une base
Postgres. Pour éviter les problèmes d'accès concurrentiels avec la base,
je crée un thread qui va recevoir les requêtes des autres threads via
queue.get et queue.put (il ne fait que des insert, donc je n'ai pas
besoin de vérifier la valeur de retour de la requete).

Mon problème est que si je limite à 10 threads, no problems, tout
fonctionne.

Mais si je monte à 100 threads, le programme se bloque (visiblement sur
lock_acquire()).

Tous les put() et get() sont avec True et un timeout de 5 secondes.

Avant de rentrer dans le détail du code, y-a-t-il quelque chose
d'évident que je ne sais pas ? genre faire 100 threads avec Python, je
suis en pleine science fiction ou le global lock est incapable de gérer
plus de 15 threads correctement ?

La fonction du thread qui gère les requetes SQL

def execute_sql(q):
    print("Start SQL Thread")
    while True:
        try:
            data = q.get(True,5)
        except:
            print("No data")
            continue
        
        print("RECEIVED SQL ORDER")
        print(data)
        print("END")
        if data == "EXIT":
            return
        try:
            request = data['request']
            arg = data['arg']
            ref.execute(request,arg)
        except:
            print("Can not execute SQL request")
            print(data)


L'appel de ce thread depuis un autre thread

                sql = dict()
                sql['request'] = "update b2_user set credit = credit -%s where id = %s"
                sql['arg'] = (i,username,)
                try:
                    q.put(sql,True,5)
                except:
                    print("Can not insert data")

Et le lancement du thread SQL

q = qu.Queue()
t = th.Thread(target = execute_sql, args = (q,))
t.start()

Back to fr.comp.lang.python | Previous | NextNext in thread | Find similar


Thread

Multythread et Queue en Python Stephane Tougard <stephane@sdf.org> - 2020-05-14 09:24 +0000
  Re: Multythread et Queue en Python Artis Sideley <sideley@yahoo.com> - 2020-06-18 02:37 -0700

csiph-web