Parallel(?) programming with python

Barry barry at barrys-emacs.org
Mon Aug 8 16:43:13 EDT 2022



> On 8 Aug 2022, at 20:24, MRAB <python at mrabarnett.plus.com> wrote:
> 
> On 2022-08-08 12:20, Stefan Ram wrote:
>> Andreas Croci <andrea.croci at gmx.de> writes:
>>> Basically the question boils down to wether it is possible to have parts of a program (could be functions) that keep doing their job while other parts do something else on the same data, and what is the best way to do this.
>>   Yes, but this is difficult. If you ask this question here,
>>   you might not be ready for this.
>>   I haven't learned it yet myself, but nevertheless tried to
>>   write a small example program quickly, which might still
>>   contain errors because of my lack of education.
>> import threading
>> import time
>> def write_to_list( list, lock, event ):
>>     for i in range( 10 ):
>>         lock.acquire()
>>         try:
>>             list.append( i )
>>         finally:
>>             lock.release()
>>         event.set()
>>         time.sleep( 3 )
>> def read_from_list( list, lock, event ):
>>     while True:
>>         event.wait()
>>         print( "Waking up." )
>>         event.clear()
>>         if len( list ):
>>             print( "List contains " + str( list[ 0 ]) + "." )
>>             lock.acquire()
>>             try:
>>                 del list[ 0 ]
>>             finally:
>>                 lock.release()
>>         else:
>>             print( "List is empty." )
>> list = []
>> lock = threading.Lock()
>> event = threading.Event()
>> threading.Thread( target=write_to_list, args=[ list, lock, event ]).start()
>> threading.Thread( target=read_from_list, args=[ list, lock, event ]).start()
>>   In basketball, first you must learn to dribble and pass,
>>   before you can begin to shoot.
>>   With certain reservations, texts that can be considered
>>   to learn Python are:
>> "Object-Oriented Programming in Python Documentation" - a PDF file,
>> Introduction to Programming Using Python - Y Daniel Liang (2013),
>> How to Think Like a Computer Scientist - Peter Wentworth (2012-08-12),
>> The Coder's Apprentice - Pieter Spronck (2016-09-21), and
>> Python Programming - John Zelle (2009).
> When working with threads, you should use queues, not lists, because queues do their own locking and can wait for items to arrive, with a timeout, if desired:

Lists do not need to be locked in python because of the GIL.
However you need locks to synchronise between threads.
And as you say a queue has all that locking built in.

Barry

> 
> 
> import queue
> import threading
> import time
> 
> def write_to_item_queue(item_queue):
>    for i in range(10):
>        print("Put", i, "in queue.", flush=True)
>        item_queue.put(i)
>        time.sleep(3)
> 
>    # Using None to indicate that there's no more to come.
>    item_queue.put(None)
> 
> def read_from_item_queue(item_queue):
>    while True:
>        try:
>            item = item_queue.get()
>        except item_queue.Empty:
>            print("Queue is empty; should've have got here!", flush=True)
>        else:
>            print("Queue contains " + str(item) + ".", flush=True)
> 
>            if item is None:
>                # Using None to indicate that there's no more to come.
>                break
> 
> item_queue = queue.Queue()
> 
> write_thread = threading.Thread(target=write_to_item_queue, args=[item_queue])
> write_thread.start()
> 
> read_thread = threading.Thread(target=read_from_item_queue, args=[item_queue])
> read_thread.start()
> 
> # Wait for the threads to finish.
> write_thread.join()
> read_thread.join()
> 
> print("Finished.")
> -- 
> https://mail.python.org/mailman/listinfo/python-list
> 



More information about the Python-list mailing list