Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simple threading event example [closed]

I'm reading Python 3's Threading documentation but I'm having trouble understanding the material.

I've gotten two timers to run side by side but I don't know how to make these two threads interact with each other. Lock, pass an event or anything.

Could somebody just dump a simple full example here with brief description of what it does?

I'm trying to learn 3.3 so if possible would you be able to post code that works for this version. I'm also finding that the tutorials I find aren't letting me know what version of Python they're exampling.

like image 535
Tolure Avatar asked Apr 24 '13 18:04

Tolure


People also ask

What is threading event ()?

A threading. Event object wraps a boolean variable that can either be “set” (True) or “not set” (False). Threads sharing the event instance can check if the event is set, set the event, clear the event (make it not set), or wait for the event to be set.

How do you close a multi thread in Python?

exit(). In Python, any alive non-daemon thread blocks the main program to exit.

What is the difference between threading lock and threading RLock?

A Lock object can not be acquired again by any thread unless it is released by the thread which is accessing the shared resource. An RLock object can be acquired numerous times by any thread. A Lock object can be released by any thread. An RLock object can only be released by the thread which acquired it.


1 Answers

Example based on queue documentation:

#!python3
import threading
from queue import Queue
import time

# lock to serialize console output
lock = threading.Lock()

def do_work(item):
    time.sleep(.1) # pretend to do some lengthy work.
    # Make sure the whole print completes or threads can mix up output in one line.
    with lock:
        print(threading.current_thread().name,item)

# The worker thread pulls an item from the queue and processes it
def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

# Create the queue and thread pool.
q = Queue()
for i in range(4):
     t = threading.Thread(target=worker)
     t.daemon = True  # thread dies when main thread (only non-daemon thread) exits.
     t.start()

# stuff work items on the queue (in this case, just a number).
start = time.perf_counter()
for item in range(20):
    q.put(item)

q.join()       # block until all tasks are done

# "Work" took .1 seconds per task.
# 20 tasks serially would be 2 seconds.
# With 4 threads should be about .5 seconds (contrived because non-CPU intensive "work")
print('time:',time.perf_counter() - start)

Output:

Thread-3 2
Thread-1 0
Thread-2 1
Thread-4 3
Thread-3 4
Thread-1 5
Thread-2 6
Thread-4 7
Thread-3 8
Thread-1 9
Thread-2 10
Thread-4 11
Thread-3 12
Thread-1 13
Thread-2 14
Thread-4 15
Thread-1 17
Thread-3 16
Thread-2 18
Thread-4 19
time: 0.5017914706686906
like image 162
Mark Tolonen Avatar answered Oct 08 '22 04:10

Mark Tolonen