On 1/8/12 1:45 PM, Yigit Turgut <y.tur...@gmail.com> wrote:
There are no imports other than defined on the script, which are;

import pygame
import sys
import time
import math
import pp

You are correct about  trying to pass two functions and second one is
in place where a tuple of arguments supposed to be. But what if these
functions don't have any arguments ? I tested functions test1() and
test2() seperately ; they work. Once I figure out how to run these
functions simultaneously, I will add an argument to test2 and try then
on. My main goal is to simultaneously run two functions, one of them
has one argument the other doesn't. To get familiar with parallel
processing I am experimenting now without arguments and then I will
embed the code to my application. I am experimenting with the
following ;

import pygame
import sys
import time
import math
import pp

screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
timer = pygame.time.Clock()
white = True
start = time.time()
end = time.time() - start

def test1():
   global end
   global white
   while(end<5):
     end = time.time() - start
     timer.tick(4) #FPS
     screen.fill((255,255,255) if white else (0, 0, 0))
     white = not white
     pygame.display.update()

def test2():
   global end
   while(end<5):
     end = time.time() - start
     print end

ppservers = ()
job_server = pp.Server(ppservers=ppservers)
print "Starting pp with", job_server.get_ncpus(), "workers"

job1 = job_server.submit(test1())
job2 = job_server.submit(test2())
result = job1()
result2 = job2()

print "Counting...", result2

job_server.print_stats()

test1() works as expected (job1) but test2() doesn't work and I get
the following traceback ;

Traceback (most recent call last):
   File "fl.py", line 33, in<module>
     job1 = job_server.submit(test1())
   File "/usr/lib/python2.6/site-packages/pp.py", line 458, in submit
     sfunc = self.__dumpsfunc((func, ) + depfuncs, modules)
   File "/usr/lib/python2.6/site-packages/pp.py", line 629, in
__dumpsfunc
     sources = [self.__get_source(func) for func in funcs]
   File "/usr/lib/python2.6/site-packages/pp.py", line 696, in
__get_source
     sourcelines = inspect.getsourcelines(func)[0]
   File "/usr/lib/python2.6/inspect.py", line 678, in getsourcelines
     lines, lnum = findsource(object)
   File "/usr/lib/python2.6/inspect.py", line 519, in findsource
     file = getsourcefile(object) or getfile(object)
   File "/usr/lib/python2.6/inspect.py", line 441, in getsourcefile
     filename = getfile(object)
   File "/usr/lib/python2.6/inspect.py", line 418, in getfile
     raise TypeError('arg is not a module, class, method, '
TypeError: arg is not a module, class, method, function, traceback,
frame, or code object

Error is related to test1 not having an argument.  When I leave it
empty as following ;

job1 = job_server.submit(test1,())

test1 doesn't run. When I do ;

job1 = job_server.submit(test1())

Display works but I get;

TypeError: arg is not a module, class, method, function, traceback,
frame, or code object (complete traceback same as above).

And test2 doesn't work also. But when I do;

job1 = job_server.submit(test1,())
job2 = job_server.submit(test2())

I get test2 working but test1 not working. Obviously related to
argument arrangement in submit.
Hi,

I've never used pygame or Parallel Python, but I played around with the code you provided and did one of my favorite debugging techniques...I printed things out and read the output.

So one thing I did was printed the globals before the function definitions and inside test1(). Which the first print shows what I expect from calling "print globals()", then inside test1() I only get functions, modules, and a few other things. So I checked the pp documentation and found this about the globals keyword:

    globals - dictionary from which all modules, functions and classes

It also handles imports funny because I tried doing "from pprint import pprint" and it couldn't find it properly even though that's a function (it couldn't find a class that that function uses). So I think you'll have to pass things in as arguments or a dependency functions as others have suggested. There is also a 'modules' keyword that you can provide names of modules to import, which might help. And is there a reason you need to use Parallel Python and can't use something more simple like python's "multiprocessing" or the classic "os.fork()"? I understand that Parallel Python can run on remote servers in parallel...but how complicated is your program going to be?

I got the following to work (not sure if its what you want):
###
import pp

def test1():
    start = time.time()
    end = time.time() - start
    screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
    timer = pygame.time.Clock()
    white = True
    while(end<5):
        end = time.time() - start
    timer.tick(4) #FPS
    screen.fill((255,255,255) if white else (0, 0, 0))
    white = not white
    pygame.display.update()

def test2():
    start = time.time()
    end2= time.time() - start
    while(end2<5):
        end2 = time.time() - start
    print end2

ppservers = ()
job_server = pp.Server(ppservers=ppservers)

job1 = job_server.submit(test1, modules=("pygame","time"))
job2 = job_server.submit(test2, modules=("time",))
result = job1()
result2 = job2()

print  result2

job_server.print_stats()
###

However, I don't know if this will always work the way you want it to, depending on how you setup your Parallel Python servers. By that I mean, if you run this on any machine that isn't local, I think it will try to connect to that remote display when getting the pygame "screen". But again, I've never used pygame. And this was also a quick throw together, so you could probably pass in "start" and stuff like that so that it doesn't have to be calculated both times.

Summary: Parallel Python doesn't handle global variables in a normal way (it doesn't like things that aren't functions, modules, or classes) so...don't use globals. Let me know if any of that didn't make sense.

-Dave

P.S. If anyone has any other results I would be curious to hear.
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to