removeall() in list

castironpi at gmail.com castironpi at gmail.com
Sat Jan 12 10:38:11 EST 2008


On Jan 12, 8:04 am, castiro... at gmail.com wrote:
> On Jan 11, 5:26 pm, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:
>
> > castiro... at gmail.com writes:
>
> > 1. Put a single thread in charge of the list, and communicate with it
> > by message passing through Queues.  To get X out of the list, you'd
> > send the mutator thread a message asking for removal.  The mutator
> > thread would loop reading and processing messages from the queue,
> > blocking when no requests are pending.  This is sort of the preferred
> > Python style and is pretty simple to get correct, but if there are
> > many such objects you can end up with more threads than you really
> > want.
>
> I've heard this called 'fire and forget'.  You can insure that
> mutations are honored one-at-a-time  and in the order received.  How
> do you make a -read- operation; wait for queued mutations, that is
> lock for a turn on the queue?  Can you optionally read whatever the
> state is, regardless of what's happened in the meantime?  Thing is,
> one thread needs its -own- preceding operations completed before a
> reading operation.

Brainstorm.

First, isolation of problem:  Terminates at 2000 or so, on my
computer.

import thread
import time
import random
counter= 0
def simplecounter():
	global counter
	ret= counter
	counter+= 1
	time.sleep( random.uniform( 0, .001 ) )
	return counter
glist= []
def th3():
	while 1:
		ret= simplecounter()
		glist.append( ret )
		print ret,
		assert glist== range( 1, len( glist )+1 )
thread.start_new_thread( th3, () )
time.sleep(1)
thread.start_new_thread( th3, () )
time.sleep( 1000 )

Second, the thoughts:  'with a.callbacklock():' looks best currently.

'''multithreading ideas:
1.  Put a single thread in charge
	a.k.a. fire and forget.
	- Lots of extra threads
	+ But most are blocking most of the time
	+ honored one-at-a-time, and in order received
	+ ...optionally including read-access, blocking on
	to get return values
	a. synchronous callbacks, for read-access
		+ multi-step, user-definitionized operations
		- one consumer can hang an entire object
		i.  with a.callbacklock():?
			+ only call acquire() from curr. thread, enqueue
			lock obj., released from producer thread "soon"
			using message-queue semantics
	b. mini-transaction, guarantees all and only
		consumer's ops occur in succession
		- can't do anything amidst an indivdual locking
		- no multi-step ops
2.  Lock mutation and/or all operations
	a. Locker.op
	b. with Locker.withop
	- In Python, other programmers always have access
	to your data; nothing guarantees they'll use "with locker"
	+ User-definitioning quite easy
3.  @mutation decorator
	def mutation( func ):
		def newfunc( self, *a, **k ):
			self.lock.acquire()
			func( *a, **k )
			self.lock.release()
4.  List-only solution:
	Use a dictionary, map item to its index.
	To retrieve, sort on value, not key
'''



More information about the Python-list mailing list