Re: [Py4j-users] Multiprocessing error
Status: Beta
Brought to you by:
barthe
|
From: Eleftherios A. <ele...@df...> - 2012-06-22 14:51:17
|
Hi Barthélémy,
I just tried rewriting the code as following. Two threads printed out their result successfully, the third pool worker gave a similar error. (I am running this in a 2-core machine)
from py4j.java_gateway import JavaGateway, GatewayClient, java_import
import multiprocessing, time, random
def singlethread(socket_no):
print "Thread starting"
gatewayclient = GatewayClient('localhost', socket_no)
gateway = JavaGateway(gatewayclient, auto_convert=True, auto_field=True)
#create a new view for the jvm
meteor_view = gateway.new_jvm_view()
#import required packages
java_import(meteor_view, 'edu.cmu.meteor.scorer.*')
#initialize the java object
java_import(meteor_view, 'edu.cmu.meteor.util.*')
#pass the language setting into the meteor configuration object
config = meteor_view.MeteorConfiguration();
config.setLanguage("en");
scorer = meteor_view.MeteorScorer(config)
print "object initialized"
#run object function
stats = scorer.getMeteorStats("Test sentence", "Test sentence !");
print stats.score
return 1
if __name__ == '__main__':
socket_no = 25336
# gatewayclient = GatewayClient('localhost', socket_no)
print "Gclient started"
output:
Gclient started
Multipool initialized
Thread starting
Thread starting
Thread starting
Process PoolWorker-3:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/multiprocessing/process.py", line 258,
in _bootstrap
self.run()
File "/usr/local/lib/python2.7/multiprocessing/process.py", line 114,
in run
self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python2.7/multiprocessing/pool.py", line 99, in
worker
put((job, i, result))
File "/usr/local/lib/python2.7/multiprocessing/queues.py", line 392,
in put
return send(obj)
File "/usr/local/lib/python2.7/site-packages/py4j/java_gateway.py",
line 432, in __call__
self.target_id, self.name)
File "/usr/local/lib/python2.7/site-packages/py4j/protocol.py", line
271, in get_return_value
raise Py4JError('An error occurred while calling %s%s%s.
Trace:\n%s\n' % (target_id, '.', name, value))
Py4JError: An error occurred while calling o6.__getnewargs__. Trace:
py4j.Py4JException: Method __getnewargs__([]) does not exist
at
py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:346)
at
py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:355)
at py4j.Gateway.invoke(Gateway.java:247)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:124)
at py4j.commands.CallCommand.execute(CallCommand.java:81)
at py4j.GatewayConnection.run(GatewayConnection.java:175)
at java.lang.Thread.run(Thread.java:636)
object initialized
0.335206780367
object initialized
0.335206780367
Any suggestions welcome,
Lefteris
On 22/06/12 16:25, Barthelemy Dagenais wrote:
> Hi Eleftherios,
>
> in this code:
>
> if __name__ == '__main__':
> socket_no = 25336
> gatewayclient = GatewayClient('localhost', socket_no)
> print "Gclient started"
> gateway = JavaGateway(gatewayclient, auto_convert=True,
> auto_field=True)
> print "Gateway started"
>
> p = multiprocessing.Pool(2)
> print "Multipool initialized"
> p.map(singlethread, [gateway, gateway, gateway])
>
> You are creating only one instance of JavaGateway and this instance is passed to each worker (the list [gateway, gateway, gateway] is in fact a list of three pointers pointing to the same instance). I usually recommend to create one JavaGateway instance per worker.
>
> Unless this was not the code that caused the problem, I would start by creating a JavaGateway in each worker and then, if you still encounter the problem, we can start looking at other possibilities.
>
> Thanks,
> Barthélémy
>
>
> On 2012-06-22, at 10:20 AM, Eleftherios Avramidis wrote:
>
>> Hi Barthélémy,
>>
>> thanks for your quick response. I am trying to understand your suggestion:
>> - On the Java side I have initialized GatewayServer on socket 25336
>> - On the Python side I initialized one GatewayClient per thread,
>> connecting to socket 25336.
>>
>> Is this the right solution so that the sockets are not being shared?
>>
>> best
>> Eleftherios
>>
>>
>>
>>
>>
>> On 22/06/12 15:55, Barthelemy Dagenais wrote:
>>> Hi,
>>>
>>> Please try to initialize the gateway in the thread/process and not outside. I believe you may be sharing sockets across threads/processes, which would explain the weird behavior you are observing.
>>>
>>> Barthélémy
>>>
>>> On 2012-06-22, at 9:08 AM, Eleftherios Avramidis wrote:
>>>
>>>> Dear all,
>>>>
>>>> I would like your help with a particular issue which occurs when I am
>>>> trying to use python multiprocessing, along with Py4j Java objects.
>>>>
>>>>
>>>> def singlethread(gateway):
>>>> print "Thread starting"
>>>>
>>>> #create a new view for the jvm
>>>> meteor_view = gateway.new_jvm_view()
>>>> #import required packages
>>>> java_import(meteor_view, 'edu.cmu.meteor.scorer.*')
>>>> #initialize the java object
>>>> scorer = meteor_view.MeteorScorer()
>>>> print "object initialized"
>>>> #run object function
>>>> stats = scorer.getMeteorStats("Test sentence", "Test sentence !");
>>>> print stats.score
>>>>
>>>> if __name__ == '__main__':
>>>> socket_no = 25336
>>>> gatewayclient = GatewayClient('localhost', socket_no)
>>>> print "Gclient started"
>>>> gateway = JavaGateway(gatewayclient, auto_convert=True,
>>>> auto_field=True)
>>>> print "Gateway started"
>>>>
>>>> p = multiprocessing.Pool(2)
>>>> print "Multipool initialized"
>>>> p.map(singlethread, [gateway, gateway, gateway])
>>>>
>>>>
>>>>
>>>> output:
>>>>
>>>> Gclient started
>>>> Gateway started
>>>> Multipool initialized
>>>> Exception in thread Thread-2:
>>>> Traceback (most recent call last):
>>>> File "/usr/local/lib/python2.7/threading.py", line 552, in
>>>> __bootstrap_inner
>>>> self.run()
>>>> File "/usr/local/lib/python2.7/threading.py", line 505, in run
>>>> self.__target(*self.__args, **self.__kwargs)
>>>> File "/usr/local/lib/python2.7/multiprocessing/pool.py", line 313, in
>>>> _handle_tasks
>>>> put(task)
>>>> File "/usr/local/lib/python2.7/site-packages/py4j/java_gateway.py",
>>>> line 432, in __call__
>>>> self.target_id, self.name)
>>>> File "/usr/local/lib/python2.7/site-packages/py4j/protocol.py", line
>>>> 271, in get_return_value
>>>> raise Py4JError('An error occurred while calling %s%s%s.
>>>> Trace:\n%s\n' % (target_id, '.', name, value))
>>>> Py4JError: An error occurred while calling t.__getnewargs__. Trace:
>>>> java.lang.StringIndexOutOfBoundsException: String index out of range: -1
>>>> at java.lang.String.substring(String.java:1949)
>>>> at java.lang.String.substring(String.java:1916)
>>>> at py4j.Gateway.invoke(Gateway.java:250)
>>>> at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:124)
>>>> at py4j.commands.CallCommand.execute(CallCommand.java:81)
>>>> at py4j.GatewayConnection.run(GatewayConnection.java:175)
>>>> at java.lang.Thread.run(Thread.java:636)
>>>>
>>>>
>>>> I would be happy if somebody can help me find out what exactly the error
>>>> may be, or if you can indicate where I should look for the problem.
>>>>
>>>> Interestingly enough, this problem doesn't occur when running without
>>>> multiprocessing. It also runs fine with other Java programs. But how can
>>>> I specify which aspect of the Java program causes the error?
>>>>
>>>> best
>>>> Eleftherios
>>>>
>>>> --
>>>> MSc. Inf. Eleftherios Avramidis
>>>> DFKI GmbH, Alt-Moabit 91c, 10559 Berlin
>>>> Tel. +49-30 238 95-1806
>>>>
>>>> Fax. +49-30 238 95-1810
>>>>
>>>> -------------------------------------------------------------------------------------------
>>>> Deutsches Forschungszentrum fuer Kuenstliche Intelligenz GmbH
>>>> Firmensitz: Trippstadter Strasse 122, D-67663 Kaiserslautern
>>>>
>>>> Geschaeftsfuehrung:
>>>> Prof. Dr. Dr. h.c. mult. Wolfgang Wahlster (Vorsitzender)
>>>> Dr. Walter Olthoff
>>>>
>>>> Vorsitzender des Aufsichtsrats:
>>>> Prof. Dr. h.c. Hans A. Aukes
>>>>
>>>> Amtsgericht Kaiserslautern, HRB 2313
>>>> -------------------------------------------------------------------------------------------
>>>>
>>>>
>>>> ------------------------------------------------------------------------------
>>>> Live Security Virtual Conference
>>>> Exclusive live event will cover all the ways today's security and
>>>> threat landscape has changed and how IT managers can respond. Discussions
>>>> will include endpoint security, mobile security and the latest in malware
>>>> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
>>>> _______________________________________________
>>>> Py4j-users mailing list
>>>> Py4...@li...
>>>> https://lists.sourceforge.net/lists/listinfo/py4j-users
>>
>> --
>> MSc. Inf. Eleftherios Avramidis
>> DFKI GmbH, Alt-Moabit 91c, 10559 Berlin
>> Tel. +49-30 238 95-1806
>>
>> Fax. +49-30 238 95-1810
>>
>> -------------------------------------------------------------------------------------------
>> Deutsches Forschungszentrum fuer Kuenstliche Intelligenz GmbH
>> Firmensitz: Trippstadter Strasse 122, D-67663 Kaiserslautern
>>
>> Geschaeftsfuehrung:
>> Prof. Dr. Dr. h.c. mult. Wolfgang Wahlster (Vorsitzender)
>> Dr. Walter Olthoff
>>
>> Vorsitzender des Aufsichtsrats:
>> Prof. Dr. h.c. Hans A. Aukes
>>
>> Amtsgericht Kaiserslautern, HRB 2313
>> -------------------------------------------------------------------------------------------
>>
>>
>> ------------------------------------------------------------------------------
>> Live Security Virtual Conference
>> Exclusive live event will cover all the ways today's security and
>> threat landscape has changed and how IT managers can respond. Discussions
>> will include endpoint security, mobile security and the latest in malware
>> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
>> _______________________________________________
>> Py4j-users mailing list
>> Py4...@li...
>> https://lists.sourceforge.net/lists/listinfo/py4j-users
--
MSc. Inf. Eleftherios Avramidis
DFKI GmbH, Alt-Moabit 91c, 10559 Berlin
Tel. +49-30 238 95-1806
Fax. +49-30 238 95-1810
-------------------------------------------------------------------------------------------
Deutsches Forschungszentrum fuer Kuenstliche Intelligenz GmbH
Firmensitz: Trippstadter Strasse 122, D-67663 Kaiserslautern
Geschaeftsfuehrung:
Prof. Dr. Dr. h.c. mult. Wolfgang Wahlster (Vorsitzender)
Dr. Walter Olthoff
Vorsitzender des Aufsichtsrats:
Prof. Dr. h.c. Hans A. Aukes
Amtsgericht Kaiserslautern, HRB 2313
-------------------------------------------------------------------------------------------
|