After stumbling over a question on stackoverflow about how you’d use python-gearman for checking the current status of a running background task, I decided to dig a bit deeper into python-gearman and .. well, answer how you’d do just that.
It turns out it wasn’t as straight forward as it should have been, but at least I managed to solve it by using the current API. First of all you’ll have to keep track of which Gearman server gets your task, and what handle it has assigned to the task. These two values identify a current running task, and since the identifiers (handle) isn’t globally unique, you’ll also have to keep track of the current server (so you know where to ask).
To request the current status of a long running task you’ll have to create appropriate instances of the GearmanJob and GearmanJobRequest yourself.
Here’s a small example of how you can do this:
import gearman client = gearman.GearmanClient(['localhost']) result = client.submit_job('reverse', 'this is a string', background=True);
The connection information is available through result.job.connection (.gearman_host and .gearman_port), while the handle is available through result.job.handle.
To check the status of a currently running job you create a GearmanClient, but only supply the server you want to query for the current state:
client = gearman.GearmanClient(['localhost']) # configure the job to request status for - the last four is not needed for Status requests. j = gearman.job.GearmanJob(client.connection_list, result.job.handle, None, None, None, None) # create a job request jr = gearman.job.GearmanJobRequest(j) jr.state = 'CREATED' # request the state from gearmand res = client.get_job_status(jr) # the res structure should now be filled with the status information about the task print(str(res.status.numerator) + " / " + str(res.status.denominator))
That should at least solve the problem until python-gearman gets an easier API to do these kinds of requests.
Update: I’ve also added a convenience function to my python-gearman fork at github.