On 6/1/2012 11:23 AM, Temia Eszteri wrote:
I've got a bit of a problem - my project uses weak sets in multiple
areas, the problem case in particular being to indicate what objects
are using a particular texture, if any, so that its priority in OpenGL
can be adjusted to match at the same time as it being (de)referenced
by any explicit calls.

Problem is that for certain high-frequency operations, it seems
there's too much data going in and out for it to handle - the
following traceback is given to me (project path changed to protect
the innocent):

Traceback (most recent call last):
   File "C:\foo\bar\game.py", line 279, in update
     self.player.update()
   File "C:\foo\bar\player.py", line 87, in update
     PlayerBullet((self.x + 8, self.y + 9), 0, self.parent)
   File "C:\foo\bar\player.py", line 96, in __init__
     self.sprite = video.Sprite("testbullet", 0)
   File "C:\foo\bar\video.py", line 95, in __init__
     self.opengl_id = reference_texture(self, target)
   File "C:\foo\bar\video.py", line 310, in reference_texture
     if not video_handler.textures[target].references:

I gather that the .references attribute is sometimes/always a weakset. To determine its boolean value, it computes its length. For regular sets, this is sensible as .__len__() returns a pre-computed value.

   File "C:\Python27\lib\_weakrefset.py", line 66, in __len__
     return sum(x() is not None for x in self.data)

Given that len(weakset) is defined (sensibly) as the number of currently active members, it must count. weakset should really have .__bool__ method that uses any() instead of sum(). That might reduce, but not necessarily eliminate your problem.

   File "C:\Python27\lib\_weakrefset.py", line 66, in<genexpr>
     return sum(x() is not None for x in self.data)
RuntimeError: Set changed size during iteration

I can think of two reasons:

1. You are using multiple threads and another thread does something to change the size of the set during the iteration. Solution? put a lock around the if-statement so no other thread can change self.data during the iteration.

2. Weakset members remove themselves from the set before returning None. (Just a thought, in case you are not using threads).

--
Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to