Newsgroup: it.comp.lang.delphi
Titolo: Re: thread e db

update su un db mysql, cosa consigliate?
Sarebbe meglio che spiegassi perché vuoi farlo. In particolare perché
vuoi usare il multithread. Te lo chiedo perché è opinione diffusa che
il MT aumenti le performance mentre, almeno altrettanto diffusamente,
non è così. E oltretutto la gestione dei thread complica di molto la
programmazione. E' bene chiarire che i thread in genere
parallelizzano, non necessariamente velocizzano. Anzi, in molti casi è
il contrario, perché parallelizzano molto male su macchine
monoprocessore. Se le tue update sono sufficientemente corte, usa un
thread solo e vivi sereno. Per usare i thread in Delphi si estende
TThread. E in ogni caso considera che avere più thread lato client
aumenta comunque il lavoro lato server.

query e poi creo tante istanze con query diverse?
Per creare un thread, si estende la classe TThread:
type
  TTuoThread = class(TThread)
...
si fa l'override del metodo protetto virtuale Execute() e bla bla bla,
come spiegato sull'help.
Dopodiché si istanziano i thread, secondo il numero che ti serve. Puoi
passargli lo statement SQL sulla Create, se vuoi renderli generici.
Dovresti assicurarti che ogni thread utilizzi una connessione distinta
(e in questo caso è **VITALE** che implementi un meccanismo di
connection pooling, per limitare l'uso di connessioni attive) oppure
la stessa connessione, ma sincronizzando l'accesso.
Torno alla domanda iniziale dell'altro mio messaggio: sei sicuro che
ti convenga il MT?

ciao a tutti, dovrei creare una serie di  thread che esegue una serie di 
update su un db mysql, cosa consigliate?
Simone 

 update su un db mysql, cosa consigliate?
Da inesperto ti direi di derivare da Tthread.
Partendo dal presupposto che il consiglio lo volessi sui trhead e non sui 
componenti DB 

ma come dovrei iniziare? creo un thread che si collega al db ed esegue la 
query e poi creo tante istanze con query diverse?
Simone 

mi spiego meglio... ho bisogno di effettuare 8/10 cicli che lavorino in 
parallelo su una stessa tabella sql (un ciclo deve prendere i record con 
cod=A un altro cod=B ecc. e dopo aver ciclato le righe deve eseguire delle 
post via tcp)... pensavo ai thread perchè da quello che possono lavorare in 
multitask, però magari cè qualche soluzione piu' pulita
Simo 

parallelo 
La mia domanda era: perché in parallelo? non puoi farlo in via
sequenzaile?

purtroppo ora ce l'ho in maniera sequenziale, però ho necessità che ogni 
coda (ogni selezione) venga eseguita in contemporanea per non far attendere 
le altre (si parla di code anche di 1000 record).... pensavo ai thread per 
non avere 10 exe che lavorano in contemporanea
Simo 

 ha scritto nel messaggio 
news:4875be0e$0$35955$4faf...@reader2.news.tin.it...

Conosci la battuta della donna incinta che ci mette 9 mesi per fare un 
bambino ?
Nove donne non fanno un bambino in un mese !
Non credo che 10 attività contemporanee durino meno; anzi....
:-)
C. 

 non avere 10 exe che lavorano in contemporanea
Avere 10 exe può andare bene. Secondo me nel tuo caso è la soluzione
migliore. In molti casi il multiprocesso viene preferito al multithread.
Sostanzialmente, nel tuo caso, sarebbe la stessa cosa ed eviterebbe di
dover implementare i thread (con tutto ciò che di complesso ne consegue).
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

beh in realtà non eseguono solo degli update.... riepilogo meglio:
-ho un server mysql in remoto (server dedicato presso un server farm)
-ogni processo (coda) deve effettuare un'update su dei record e passare 
questi record tramite chiamate http a delle pagine web php passando 
parametri ad un server diverso da quello del mysql
praticamente ogni coda/processo è indipendente dagli altri e ho necessità 
che queste operazioni non vengano accodate in quanto se ho 4 code che hanno 
per esempio rispettivamente 1000, 3000 e 30 e 1 record se vengono eseguite 
in parallelo la coda da 1 record esce subito, se fosse messa in serie 
verrebbe eseguita solo dopo aver processato le 1000+3000+30
Simone

 verrebbe eseguita solo dopo aver processato le 1000+3000+30
Stai attento. Il parallelismo può darti una percezione delle performance
sfalsata. Se stai lavorando con una macchina con un singolo processore (ma
anche quelle multiprocessore a volte non sono in grado di parallelizzare a
dovere), i task vengono comunque accodati. I tempi non si accorciano.
Se hai tre task che svolgono, rispettivamente, 3, 2 e 1 operazione:
T1: op1, op2, op3
T2: op1, op2
T3: op1
Il parallelismo può darti questo:
T1-op1, T2-op1, T3-op1, T1-op2, T2-op2, T1-op3
che non è affatto diverso da:
T1-op1, T1-op2, T1-op3, T2-op1, T2-op2, T3-op1


 dovere), i task vengono comunque accodati. I tempi non si accorciano.
Mi infilo nella discussione per capire meglio:
Da quello che dici ne deduco che è windows che gestisce autonomamente
i processori presenti nella macchina.
Nel caso di multiprocessore o dualcore (quadcore ecc..) non c'è
proprio modo di forzare la gestione dei processi su processori diversi
tramite codice?
Matteo