473,406 Members | 2,847 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,406 software developers and data experts.

Using multiprocessing inside decorator

falekmarcin
I came across a problem that I can't solve and it's associated with multiprocessing and use it inside the decorator.

When I'm calling the method run_in_parallels using multiprocessing I 'm getting the error:

Expand|Select|Wrap|Line Numbers
  1. Can't pickle <function run_testcase at 0x00000000027789C8>: it's not found as __main__.run_testcase
The call takes place inside the decorator, then followed the above-mentioned problem. At the time of calling the same method run_in_parallels without a decorator all working properly.

What is the reason of this problem?

file: w_PythonHelper.py
desc: Function 'run_in_parallel' is used to run multiple processes simultaneously. The first method, which will end operation stops the others.

Expand|Select|Wrap|Line Numbers
  1. from multiprocessing import Process,Event
  2.  
  3. class ExtProcess(Process):
  4.     def __init__(self, event,*args,**kwargs):
  5.         self.event=event
  6.         Process.__init__(self,*args,**kwargs)
  7.  
  8.     def run(self):
  9.         Process.run(self)
  10.         self.event.set()
  11.  
  12. class PythonHelper(object):
  13.     @staticmethod
  14.     def run_in_parallel(*functions):
  15.         event=Event()
  16.         processes=dict()
  17.         for function in functions:
  18.             fname=function[0]
  19.             try:fargs=function[1]
  20.             except:fargs=list()
  21.             try:fproc=function[2]
  22.             except:fproc=1
  23.             for i in range(fproc):
  24.                 process=ExtProcess(event,target=fname,args=fargs)
  25.                 process.start()
  26.                 processes[process.pid]=process
  27.         event.wait()
  28.         for process in processes.values():
  29.             process.terminate()
  30.         for process in processes.values():
  31.             process.join()
  32.  
file: w_Recorder.py
desc: function 'capture' is used to grab a screenshot

Expand|Select|Wrap|Line Numbers
  1. from PIL import ImageGrab
  2.  
  3. def capture(self,filename=time.time(),extension="png"):
  4.     ImageGrab.grab().save("{f}.{e}".format(f=filename,e=extension))
  5.  
file: w_Decorators.py
desc: Running parallel a given function along with a method 'capture' of class 'Recorder'

Expand|Select|Wrap|Line Numbers
  1. from w_Recorder import Recorder
  2. from w_PythonHelper import PythonHelper
  3.  
  4. def check(function):
  5.     def wrapper(*args):
  6.         try:
  7.             recorder=Recorder()
  8.             PythonHelper.run_in_parallel([function,args],[recorder.capture])
  9.             print("success")
  10.         except Exception as e:
  11.             print("failure: {}".format(e))
  12.         return function
  13.     return wrapper
  14.  
file: w_Logger.py
desc: Main program (generates error)

Expand|Select|Wrap|Line Numbers
  1. from w_Decorators import check
  2. import time
  3.  
  4. class Logger(object):
  5.  
  6.     @check
  7.     def run_testcase(self):
  8.         # example function (runtime: 20s)
  9.         for i in range(20):
  10.             print("number: {}".format(i))
  11.             time.sleep(1)
  12.  
  13.     def run_logger(self):
  14.         self.run_testcase()
  15.  
  16.  
  17. if __name__=="__main__":
  18.     logger=Logger()
  19.     logger.run_logger()
  20.  
file: w_Logger.py
desc: Main program (works corectly)

Expand|Select|Wrap|Line Numbers
  1. from w_PythonHelper import PythonHelper
  2. from w_Recorder import Recorder
  3. import time
  4.  
  5. class Logger(object):
  6.  
  7.     def run_testcase(self):
  8.         # example function (runtime: 20s)
  9.         for i in range(20):
  10.             print("number: {}".format(i))
  11.             time.sleep(1)
  12.  
  13.     def run_logger(self):
  14.         recorder=Recorder()
  15.         PythonHelper.run_in_parallel([self.run_testcase],[recorder.capture])
  16.  
  17. if __name__=="__main__":
  18.     logger=Logger()
  19.     logger.run_logger()
  20.  
What is the difference that these same methods presented in the two cases work differently?

I got only one answer on this strange question:

Expand|Select|Wrap|Line Numbers
  1. import traceback
  2. def wrapper(function,*args):
  3.     try:
  4.         recorder=Recorder()
  5.         PythonHelper().run_in_parallel([function,args],[recorder.capture])
  6.         print("success")
  7.     except Exception,e:
  8.         print("failure: "+traceback.format_exc(10))
  9.  
from w_Decorators import wrapper

Expand|Select|Wrap|Line Numbers
  1. if __name__=="__main__":
  2.     logger=Logger()
  3.     wrapper(logger.run_testcase)
  4.  
I can use wrapper as a function, but can't use it as decorator. I have many functions decorated by this decorator and the simpliest way is to use multiprocessing inside decorator. But unfortunatly I can't solve this problem. Maybe someone has already solved a similar problem. I would be grateful for any hint.

I've trying to make run_testcase a top level function but still nothing.
Apr 29 '12 #1
2 3988
dwblas
626 Expert 512MB
"pickle errors" generally means that multiprocessing can not pickle some method (you pass as class method as the target), which it uses to pass things around. The problem here is not the pickle error. The problem here is code that isn't tested as you go along. Start with smaller pieces and test each piece as you go along as you would then know that it is a multiprocessing problem and not a decorator problem, at least. And read the multiprocessing docs-->hint: you want to pass a function that is part of the class which will do the processing. Also this code
Expand|Select|Wrap|Line Numbers
  1. def capture(self,filename=time.time(),extension="png"):
  2.      ImageGrab.grab().save("{f}.{e}".format(f=filename,e=extensiom)) 
will use the same file every time since time.time() will not change. I will leave it up to you to discover why as you should acquire some more knowledge about Python before you attempt a project like this.
Apr 29 '12 #2
Yes. You are right about the timestamp (this is only example and doesn't affect the issue) but decorator works ok - decorator is working properly, is used for a long time and takes a lot of methods (including static methods). The problem occurred when using multiprocessing.

My Traceback:

Expand|Select|Wrap|Line Numbers
  1.     Traceback (most recent call last):
  2.       File "C:\Interpreters\Python32\lib\pickle.py", line 679, in save_global
  3.         klass = getattr(mod, name)
  4.     AttributeError: 'module' object has no attribute 'run_testcase'
  5.  
  6.     During handling of the above exception, another exception occurred:
  7.  
  8.     Traceback (most recent call last):
  9.       File "C:\EskyTests\w_Logger.py", line 19, in <module>
  10.         logger.run_logger()
  11.       File "C:\EskyTests\w_Logger.py", line 14, in run_logger
  12.         self.run_testcase()
  13.       File "C:\EskyTests\w_Decorators.py", line 14, in wrapper
  14.         PythonHelper.run_in_parallel([function,args],[recorder.capture])
  15.       File "C:\EskyTests\w_PythonHelper.py", line 25, in run_in_parallel
  16.         process.start()
  17.       File "C:\Interpreters\Python32\lib\multiprocessing\process.py", line 130, in start
  18.         self._popen = Popen(self)
  19.       File "C:\Interpreters\Python32\lib\multiprocessing\forking.py", line 267, in __init__
  20.         dump(process_obj, to_child, HIGHEST_PROTOCOL)
  21.       File "C:\Interpreters\Python32\lib\multiprocessing\forking.py", line 190, in dump
  22.         ForkingPickler(file, protocol).dump(obj)
  23.       File "C:\Interpreters\Python32\lib\pickle.py", line 237, in dump
  24.         self.save(obj)
  25.       File "C:\Interpreters\Python32\lib\pickle.py", line 344, in save
  26.         self.save_reduce(obj=obj, *rv)
  27.       File "C:\Interpreters\Python32\lib\pickle.py", line 432, in save_reduce
  28.         save(state)
  29.       File "C:\Interpreters\Python32\lib\pickle.py", line 299, in save
  30.         f(self, obj) # Call unbound method with explicit self
  31.       File "C:\Interpreters\Python32\lib\pickle.py", line 623, in save_dict
  32.         self._batch_setitems(obj.items())
  33.       File "C:\Interpreters\Python32\lib\pickle.py", line 656, in _batch_setitems
  34.         save(v)
  35.       File "C:\Interpreters\Python32\lib\pickle.py", line 299, in save
  36.         f(self, obj) # Call unbound method with explicit self
  37.       File "C:\Interpreters\Python32\lib\pickle.py", line 683, in save_global
  38.         (obj, module, name))
  39.     _pickle.PicklingError: Can't pickle <function run_testcase at 0x00000000027725C8>: it's not found as __main__.run_testcase
Apr 29 '12 #3

Sign in to post your reply or Sign up for a free account.

Similar topics

6
by: dSchwartz | last post by:
What I think I'm looking for is a way (in XSL stylesheet) to get the contents of a directory. How can this be accomplished? more detailed: /root index.aspx xsl_style.xsl /xml...
28
by: Daniel | last post by:
Hello =) I have an object which contains a method that should execute every x ms. I can use setInterval inside the object construct like this - self.setInterval('ObjectName.methodName()',...
3
by: Tatu Portin | last post by:
I have a class: class Complex { public: double x, y; Complex () {x = 0.0; y = 0.0;}; Complex operator * (Complex);
9
by: Hasani \(remove nospam from address\) | last post by:
I have a website with 2 aspx pages Foo.aspx, and bar.aspx The content of both files is //in 1 file Hello <%=Session.ToString()%> ================
1
by: Joel Byrd | last post by:
I've been using an eval() statement, which has been working fine until I put it inside of a function. Is this a known problem, and is there a known solution/work-around to this?
1
by: Max Evans | last post by:
I have a XML file, which contains itemid-elements, e.g.: <itemid>3</itemid> <itemid>12</itemid> Now I want to convert these IDs to the corresponding name via XSLT. I thought I could do it this...
1
by: Nathan Sokalski | last post by:
I have a class that is just a bunch of Shared functions (basically, a bunch of utilities I have grouped together). However, there are functions that I want to write to use inside some of these...
5
by: ertis6 | last post by:
Hi all, I need to calculate a value inside 8 nested for loops. 2 additional for loops are used during calculation. It was working fine with 4 loops. My code is like this: ... for(int i1=0;...
4
by: nhwarriors | last post by:
I am attempting to use the (new in 2.6) multiprocessing package to process 2 items in a large queue of items simultaneously. I'd like to be able to print to the screen the results of each item...
5
by: sgurukrupagmailcom | last post by:
Hi, I haven't come accross an elegant solution to a design problem that I show below. Have a look at the piece of code here: class Exc { Exc () { System.out.println ("Haribol"); }
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.