[Tutor] How python keeps track of objects

Mitch Raful mitch.raful at gmail.com
Sun Nov 23 19:05:35 CET 2014


On Sun, Nov 23, 2014 at 11:07 AM, Dave Angel <davea at davea.name> wrote:
> Please don't top-post.  Trim the quoted portion to the parts you're
> responding to, and put your response immediately after (each) section you're
> commenting on.
>
  I this the correct formatting and in plain text?

> Also, you're posting in html.  That's not always a problem, but it often is,
> depending on the vagaries of your email program.  Just tell it you want text
> format for your messages here, and we'll all see the same thing.
>
> On 11/23/2014 10:15 AM, Mitch Raful wrote:
>>
>> Thanks for the replies.   My concern was as the for loop keeps sending
>> objects into the do_something() function which uses the same reference
>> name
>> other_object and that the previously instantiated other_objected would be
>> mutated if the function wasn't finished.
>
>
> I can't process that.  I don't know what you're asking.
>
  I think you actually answered this one.  Since the for loop has to
wait for the function to return, my 'other_object' can not get
clobbered.

>> Or do all languages keep each
>> call to a function in its own memory space and there is not a collision?.
>
>
> No such statement for "all languages," as there are tens of thousands of
> them, at least.  And certainly there are some that support implicit
> concurrency via something like  "for all" meaning "you may do all of these
> in parallel if you like, and I promise that order doesn't matter".
>
> In Python, however, the function as you had it in the original message
> returns to the for loop before it gets called again.  So there's only one
> instance of the stack frame.
>
> Three ways there can be multiple stack frames for the same function:
>
> 1) the function calls itself, directly or indirectly
> 2) you have multithreading
> 3) you have multiprocessing
>
> In all of these cases, the name other_object is unambiguously replicated in
> each instance of the stack frame.  And each version of that can be bound to
> an independent object.
>
>> Since, in my case, do_something() actually occurs over a network and I use
>> the logging module, I noticed the responses come in whatever order they
>> have completed and not the order that do_something is called.
>
>
> Then you are not just doing a simple function call.  You're doing some form
> of asynchronous I/O, either by threading, or by non-blocking I/O. In either
> case, your original example doesn't begin to represent what you're doing.
>
 Sorry for the newbie mistake of not mentioning that.

> The "responses come in" imply that somewhere you're polling for those
> responses.  Or you've changed your code to use multiple threads (as you show
> below).
>
>> I also have
>> another function that downloads the resulting files on the devices that
>> do_something() has them generate.   To get all of this to look orderly in
>> a
>> log output, I did this...
>>
>> for object in objects:
>>      t0 = Thread( target=do_something, args=(object,))
>>      t0.start()
>>      t1 = Thread( target=get_files, args=(object, backup_dir))
>>     t1.start()
>>
>> As to whether I read this somewhere, I wish I could blame a publication.
>> Alas, I came up with 'beauty' on my own.
>
>
> Once you launch a second thread, you have to worry about when it's done
> updating the corresponding item in objects.  So somewhere you probably want
> a wait() call.
>

 Would a t0.join() work instead of a wait call?

Mitch

> Anyway, the need for threads is triggered by my point 1), a need to continue
> your loop without waiting for the first operation to complete.  It doesn't
> happen to be the user interface that's causing it, but the network.  You've
> decided that you want to start multiple network operations without waiting
> for the first to complete.  That's easiest done with threads.
>
> --
> DaveA


More information about the Tutor mailing list