[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

Re: A design problem

Gabriel Genellina

1/31/2008 4:35:00 AM

En Thu, 31 Jan 2008 01:57:41 -0200, Dan Upton <upton@virginia.edu>
escribió:

> Or: How to write Python like a Python programmer, not a Java
> programmer. This will be a little long-winded...
>
> So I just recently started picking up Python, mostly learning the new
> bits I need via Google and otherwise cobbling together the functions
> I've already written. It occurred to me though that one of my
> programs was still probably written very much like I would in Java
> (part of the reason I'm picking up Python is I'm tired of my coworkers
> making fun of me for writing parsing/reformatting programs in Java).

Maybe you've already read this, but I'll post the links anyway:
http://dirtsimple.org/2004/12/python-is-not...
http://dirtsimple.org/2004/12/java-is-not-python-e...

> Anyway, basically here's the problem I have:
>
> -Fork off n copies of a program, where n is a command line parameter,
> and save their PIDs. The way I've been accomplishing this is
> basically:
>
> processes=[]
> for i in range(numProcs):
> pid=os.fork()
> if pid == 0:
> # do the forking
> else:
> processes.append(pid)

Looks fine to me.

> -Every so much time (say, every second), I want to ask the OS
> something about that process from under /proc/pid (this is on Linux),
> including what core it's on.
> while 1:
> for i in processes:
> file = open("/proc/"+str(i)+"/stat")

(I hope there is a time.sleep(1) after processing that)
- don't use file as a variable name, you're shadowing the builtin file
type.
- "i" is very much overloaded as a variable name everywhere... I'd use pid
instead
- string interpolation looks better (and is faster, but that's not so
relevant here)
for pid in processes:
statfile = open("/proc/%d/stat" % pid)

>> From that, one of the pieces of data I'll get is which core it's
> running on, which then will prompt me to open another file.
> Ultimately, I want to have n files, that are a bunch of lines:
> corenum data1 data2 ...
> corenum data1 data2 ...
> ...
>
> and so on. The way I was going to approach it was to every time
> through the loop, read the data for one of the processes, open its
> file, write out to it, and close it, then do the same for the next
> process, and so on. Really though I don't need to be able to look at
> the data until the processes are finished, and it would be less I/O,
> at the expense of memory, to just save all of the lists of data as I
> go along and then dump them out to disk at the end of the Python
> program's execution. I feel like Python's lists or dictionaries
> should be useful here, but I'm not really sure how to apply them,
> particularly in a "Python-like" way.
>
> For anybody who made it all the way through that description ;) any
> suggestions?

The simplest solution would be to use a tuple to store a row of data. You
know (implicitely) what every element contains: the first item is
"corenum", the second item is "data1", the third item is "data2" and so
on... (based on your example above).
Collect those tuples (rows) into a list (one list per process), and
collect all lists into a dictionary indexed by pid.

That is, at the beginning, create an empty dictionary:
info = {}

After each forking, at the same time you save the pid, create the empty
list:
info[pid] = []

After you read and process the /proc file to obtain what you want, apend a
new element to that list:
info[pid].append((corenum, data1, data2, ...))
(notice the double parenthesis)

At the end, write all that info on disk. The csv module looks like a good
candidate:

import csv

for pid in processes:
writer = csv.writer(open("process-%d.csv" % pid, "wb"))
writer.writerows(info[pid])

That's all
--
Gabriel Genellina

1 Answer

Ben Finney

1/31/2008 5:37:00 AM

0

"Gabriel Genellina" <gagsl-py2@yahoo.com.ar> writes:

> En Thu, 31 Jan 2008 01:57:41 -0200, Dan Upton <upton@virginia.edu>
> escribió:
>
> > Or: How to write Python like a Python programmer, not a Java
> > programmer. This will be a little long-winded...
> >
> > So I just recently started picking up Python, mostly learning the new
> > bits I need via Google and otherwise cobbling together the functions
> > I've already written. It occurred to me though that one of my
> > programs was still probably written very much like I would in Java
> > (part of the reason I'm picking up Python is I'm tired of my coworkers
> > making fun of me for writing parsing/reformatting programs in Java).
>
> Maybe you've already read this, but I'll post the links anyway:
> http://dirtsimple.org/2004/12/python-is-not...
> http://dirtsimple.org/2004/12/java-is-not-python-e...

Also, for someone "learning the new bits I needed via Google", try
these:

The Python tutorial
<URL:http://www.python.org/do...

Python anti-pitfalls
<URL:http://mechanicalcat.net/cgi-bin/log/2003...

As for "write Python like a Python programmer", this:

Code Like a Pythonista: Idiomatic Python
<URL:http://python.net/~goodger/projects/pycon/2007/idiomatic/handou...

--
\ "I bought a self learning record to learn Spanish. I turned it |
`\ on and went to sleep; the record got stuck. The next day I |
_o__) could only stutter in Spanish." â??Steven Wright |
Ben Finney