Prev: How to print SRE_Pattern (regexp object) text for debugging purposes?
Next: How to print SRE_Pattern (regexp object) text for debuggingpurposes?
From: pacopyc on 17 Jun 2010 17:52 Hi, I'm trying to work with threads and I need your help. This is code: from threading import Thread from Queue import Queue import time import random def test_fun (k,q,t): time.sleep(t) print "hello world from thread " + str(q.get()) + " (sleep time = " + str(t) + " sec.)" q.task_done() queue = Queue() for i in range (1,10): queue.put(i) for j in range(queue.qsize()): num = random.randint(1,30) worker = Thread(target=test_fun, args=(j,queue,num)) worker.setDaemon(True) worker.start() queue.join() Execution: hello world from thread 1 (sleep time = 5 sec.) hello world from thread 2 (sleep time = 5 sec.) hello world from thread 3 (sleep time = 6 sec.) hello world from thread 4 (sleep time = 8 sec.) hello world from thread 5 (sleep time = 10 sec.) hello world from thread 6 (sleep time = 13 sec.) hello world from thread 7 (sleep time = 18 sec.) hello world from thread 8 (sleep time = 19 sec.) hello world from thread 9 (sleep time = 20 sec.) Some questions for you: 1) Why order is always the same (thread 1, thread 2, thread 3 .... thread 9) and also seconds are always increasing? I don't understand. 2) I'd like to decide a max time for each thread. If max time = 7 sec. I want to print only threads with sleep time <= 7 sec. How can I do? Can you modify my code? Thank you very much
From: MRAB on 17 Jun 2010 19:04 pacopyc wrote: > Hi, I'm trying to work with threads and I need your help. This is > code: > > from threading import Thread > from Queue import Queue > import time > import random > > def test_fun (k,q,t): > time.sleep(t) > print "hello world from thread " + str(q.get()) + " (sleep time = > " + str(t) + " sec.)" > q.task_done() > > queue = Queue() > for i in range (1,10): > queue.put(i) > for j in range(queue.qsize()): > num = random.randint(1,30) > worker = Thread(target=test_fun, args=(j,queue,num)) > worker.setDaemon(True) > worker.start() > queue.join() > > > Execution: > > hello world from thread 1 (sleep time = 5 sec.) > hello world from thread 2 (sleep time = 5 sec.) > hello world from thread 3 (sleep time = 6 sec.) > hello world from thread 4 (sleep time = 8 sec.) > hello world from thread 5 (sleep time = 10 sec.) > hello world from thread 6 (sleep time = 13 sec.) > hello world from thread 7 (sleep time = 18 sec.) > hello world from thread 8 (sleep time = 19 sec.) > hello world from thread 9 (sleep time = 20 sec.) > > Some questions for you: > > 1) Why order is always the same (thread 1, thread 2, thread 3 .... > thread 9) and also seconds are always increasing? I don't understand. > 2) I'd like to decide a max time for each thread. If max time = 7 sec. > I want to print only threads with sleep time <= 7 sec. How can I do? > Can you modify my code? > > Thank you very much 1) First it puts the numbers 1..9 into 'queue', then it starts 9 threads, giving each a number 'num'. Each thread waits for 'num' seconds ('t' in the thread). The thread with the lowest value of 'num' wakes first, gets the first entry from 'queue' (the value 1), and therefore prints "thread 1". The thread with the second-lowest value of 'num' wakes next, gets the second entry from 'queue' (the value 2), and therefore prints "thread 2". And so on. 2) If a thread is given a value of 'num' of more than a maximum, that thread shouldn't print its output, but it should still get the entry from the queue (assuming that you want it to still behave the same otherwise).
From: pacopyc on 18 Jun 2010 17:45 On 18 Giu, 01:04, MRAB <pyt...(a)mrabarnett.plus.com> wrote: > pacopyc wrote: > > Hi, I'm trying to work with threads and I need your help. This is > > code: > > > from threading import Thread > > from Queue import Queue > > import time > > import random > > > def test_fun (k,q,t): > > time.sleep(t) > > print "hello world from thread " + str(q.get()) + " (sleep time = > > " + str(t) + " sec.)" > > q.task_done() > > > queue = Queue() > > for i in range (1,10): > > queue.put(i) > > for j in range(queue.qsize()): > > num = random.randint(1,30) > > worker = Thread(target=test_fun, args=(j,queue,num)) > > worker.setDaemon(True) > > worker.start() > > queue.join() > > > Execution: > > > hello world from thread 1 (sleep time = 5 sec.) > > hello world from thread 2 (sleep time = 5 sec.) > > hello world from thread 3 (sleep time = 6 sec.) > > hello world from thread 4 (sleep time = 8 sec.) > > hello world from thread 5 (sleep time = 10 sec.) > > hello world from thread 6 (sleep time = 13 sec.) > > hello world from thread 7 (sleep time = 18 sec.) > > hello world from thread 8 (sleep time = 19 sec.) > > hello world from thread 9 (sleep time = 20 sec.) > > > Some questions for you: > > > 1) Why order is always the same (thread 1, thread 2, thread 3 .... > > thread 9) and also seconds are always increasing? I don't understand. > > 2) I'd like to decide a max time for each thread. If max time = 7 sec.. > > I want to print only threads with sleep time <= 7 sec. How can I do? > > Can you modify my code? > > > Thank you very much > > 1) > > First it puts the numbers 1..9 into 'queue', then it starts 9 threads, > giving each a number 'num'. > > Each thread waits for 'num' seconds ('t' in the thread). > > The thread with the lowest value of 'num' wakes first, gets the first > entry from 'queue' (the value 1), and therefore prints "thread 1". > > The thread with the second-lowest value of 'num' wakes next, gets the > second entry from 'queue' (the value 2), and therefore prints "thread > 2". > > And so on. > > 2) > > If a thread is given a value of 'num' of more than a maximum, that > thread shouldn't print its output, but it should still get the entry > from the queue (assuming that you want it to still behave the same > otherwise). Ok, the problem is that I want fix a time max for each thread. For example run 10 threads (each can terminate its work in 10 sec. max fixed time) and wait them. If they finish its work in < 10 sec. (for example 2 sec.) very good ... go on immediately (don't wait unnecessary time), but if a thread use more than 10 sec. stop wait (I kill it) .... when all threads have finished their work or when they have used all their available time (10 sec.) the program must go on (don't wait).
From: MRAB on 18 Jun 2010 18:27 pacopyc wrote: > [snip] > Ok, the problem is that I want fix a time max for each thread. For > example run 10 threads (each can terminate its work in 10 sec. max > fixed time) and wait them. If they finish its work in < 10 sec. (for > example 2 sec.) very good ... go on immediately (don't wait > unnecessary time), but if a thread use more than 10 sec. stop wait (I > kill it) .... when all threads have finished their work or when they > have used all their available time (10 sec.) the program must go on > (don't wait). It's not possible to kill a thread. If you want a thread to have a maximum time, the thread must check occasionally how long it has been running and terminate if necessary. Another programming language (Java) originally had the ability to kill threads, but that was later deprecated because it caused problems due to not knowing what the thread was doing when it was killed (it might have been in the middle of updating something at the time, for example, leaving the system in an inconsistent state).
From: pacopyc on 18 Jun 2010 18:58
On 19 Giu, 00:27, MRAB <pyt...(a)mrabarnett.plus.com> wrote: > pacopyc wrote: > > [snip] > > Ok, the problem is that I want fix a time max for each thread. For > > example run 10 threads (each can terminate its work in 10 sec. max > > fixed time) and wait them. If they finish its work in < 10 sec. (for > > example 2 sec.) very good ... go on immediately (don't wait > > unnecessary time), but if a thread use more than 10 sec. stop wait (I > > kill it) .... when all threads have finished their work or when they > > have used all their available time (10 sec.) the program must go on > > (don't wait). > > It's not possible to kill a thread. If you want a thread to have a > maximum time, the thread must check occasionally how long it has been > running and terminate if necessary. > > Another programming language (Java) originally had the ability to kill > threads, but that was later deprecated because it caused problems due to > not knowing what the thread was doing when it was killed (it might have > been in the middle of updating something at the time, for example, > leaving the system in an inconsistent state). Ok, I understand. But is possible fix max wait time (for example 60 sec.) in main thread and check queue for task done and at the same time the remaining time. When all task have done or wait time has expired main thread go on. Is it possible? Can you write code? Thank you very much. |