[Python] thread strano comportamento

Manlio Perillo manlio.perillo a gmail.com
Mar 20 Maggio 2014 13:30:33 CEST


2014-05-16 20:06 GMT+02:00 Balan Victor <balan.victor0 a gmail.com>:

> Ho necessità di fare quando segue:
>
> estrarre in continuazione una lista di comandi e lanciare al massino N
> comandi alla volta. Per fare questo pensavo di usare il modulo threading e
> ho scritto un codice simile a quello che trovate a questo indirizzo:
> http://pastebin.com/YZxa3VG8
>
>
Ho riletto il codice e mi sono accorto di questo pattern:

def run(self):
while True:
with self.semaphore:
task_dict = self.todoQ.get()
task = Task(task_dict)
task.start()

Perchè usi un semaforo?
Quale è il valore di todoQ_size?


> Se ora faccio partire il tutto mi trovo con un output simile a questo:
>
> DEBUG 4460 Consumer 2014-05-16 20:00:20,345: Get task task 32
> DEBUG 4460 Consumer 2014-05-16 20:00:20,345: Get task task 3
> DEBUG 4460 Consumer 2014-05-16 20:00:20,345: Get task task 52
> DEBUG 4460 Consumer 2014-05-16 20:00:20,345: Get task task 43
> DEBUG 4460 Consumer 2014-05-16 20:00:20,345: Get task task 27
>

Quanti "get task %d" ottieni dipende da todoQ_size.


> DEBUG 4552 task 52 2014-05-16 20:00:20,345: task 52 starting ...
>
> io dichiaro una coda di dimensione 1.
>

Ti riferisci al BoundedSemaphore(1) o intendi dire che todoQ_size è 1?


> Mi aspetto che quando faccio todoQ.put questo resti in attesa finché nella
> coda non si libera un posto invece non succede cosi. Inoltre dal log sembra
> che scarichi i task nel seguente ordine 32, 3, 52, 43, 27 e cosi via. Mi
> aspetto che il primo task sia 32, invece è 52.
>
>
In che punto del programma viene fatto il logging "task %d starting" ?

Ricorda che passa un tempo indeterminato tra quando richiedi l'esecuzione
di un processo e quando il sistema operativo lo esegue.
Quindi se in un thread esegui "contemporaneamente" N processi, non è detto
che il sistema operativo li esegua in quell'ordine.

Quello che scrivi è corretto solo se il logging lo fai subito dopo
todoQ.get e non quando il processo esterno viene eseguito.

> [...]


Ciao   Manlio
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20140520/0cb7cb5e/attachment.html>


Maggiori informazioni sulla lista Python