> On 8 Aug 2022, at 20:24, MRAB <pyt...@mrabarnett.plus.com> wrote: > > On 2022-08-08 12:20, Stefan Ram wrote: >> Andreas Croci <andrea.cr...@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 > -- https://mail.python.org/mailman/listinfo/python-list