Skip to content

Instantly share code, notes, and snippets.

@azhai
Created September 12, 2016 04:10
Show Gist options
  • Save azhai/075fbd9ca40a80879d286b180ae15fba to your computer and use it in GitHub Desktop.
Save azhai/075fbd9ca40a80879d286b180ae15fba to your computer and use it in GitHub Desktop.
Python Gearman
#-*- coding: utf-8 -*-
"""
Worker Example:
from GearWrap import gm_worker
@gm_worker.add_task
def my_add(a, b):
return float(a) + float(b)
gm_worker.work()
Client Example:
from GearWrap import gm_client
print gm_client.my_add(5, 23)
"""
import gearman
import json
import settings
class JSONDataEncoder(gearman.DataEncoder):
""" 使用JSON编解码参数与结果 """
@classmethod
def encode(cls, encodable_object):
return json.dumps(encodable_object)
@classmethod
def decode(cls, decodable_string):
return json.loads(decodable_string)
class JSONGearmanWorker(gearman.GearmanWorker):
""" 使用@gm_worker.add_task注册 """
data_encoder = JSONDataEncoder
def add_task(self, func):
def proc_job(worker, job):
return func(*job.data)
self.register_task(func.__name__, proc_job)
return proc_job
gm_worker = JSONGearmanWorker([
"%s:%d" % (settings.GEARMAN_HOST, settings.GEARMAN_PORT)
])
class JSONGearmanClient(gearman.GearmanClient):
""" 使用gm_client.xxx()调用 """
data_encoder = JSONDataEncoder
def __getattr__(self, name, **kwargs):
def send_job(*data):
job = self.submit_job(name, data, **kwargs)
if job.complete:
return job.result
return send_job
gm_client = JSONGearmanClient([
"%s:%d" % (settings.GEARMAN_HOST, settings.GEARMAN_PORT)
])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment