μ΄κ²μ λ΄κ° λ§ν μμλ ν κ²°μ½ ν΄κ²°λμ§ μμ https://github.com/nvie/rq/issues/189 μ λμΌν λ¬Έμ μ λλ€. μΌλ° ν¨μ λμ ν΄λμ€ λ©μλλ₯Ό νμ λ£μ΄μΌ νλ©° λ€μκ³Ό κ°μ κ²°κ³Όλ₯Ό μ»μ΅λλ€.
q.enqueue(rq_worker_wrapper.do_something_with_x, x)
*** PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° κΆμ₯λλ λ°©λ²μ΄ μμ΅λκΉ?
λκΈ°μ΄μ μΆκ°νλ €λ ν¨μμ SQLAlchemy μΈμ μ λν μ‘μΈμ€κ° μ λ§ νμνμ§λ§ ν¨μκ° μ΄λ₯Ό λ³λλ‘ μλ½νλλ‘ νμ¬ λ¬Έμ λ₯Ό ν΄κ²°ν μλ μμ΅λλ€.
q.enqueue(some_func, sql_sess, some_data)
*** PicklingError: Can't pickle <class 'sqlalchemy.orm.session.Session'>: it's not the same object as sqlalchemy.orm.session.Session
@EliFinkelshteyn , μ΄κ²μ΄ μλνλ λ°©μμ λλ€.
q.enqueue(MyClass.MyClassMethod,Params)
# MyClass.
class MyClass(object):
# Initializer.
def __init__(self):
self.MySQL = MySQL
<strong i="9">@classmethod</strong>
def MyClassMethod(self,Params):
Class = self
self = Class()
# do something here.
@JohnSundarraj , μλ΅ μ£Όμ μ κ°μ¬ν©λλ€! κ·Έκ²μ΄ μ§λ¬Έμ μ΄λ»κ² λλ΅νλμ§ μ λͺ¨λ₯΄κ² μ΅λλ€. νμ¬ κ°μ§κ³ μλ κ²μ λ€μκ³Ό κ°μ΅λλ€.
class MyClass:
def __init__(self, config_path):
self.mysql_connector = MySQLConnector(config_path)
def do_db_thing(self, some_data):
sql_sess = self.mysql_connector.get_mysql_connection()
# do something with sql_sess and some_data here
μ¬κΈ°μ classmethod
μ¬μ©νλ κ²μ μμ²λκ² ν¬λ°νκ³ , κΈ°λ³Έμ μΌλ‘ μ무 μ΄μ μμ΄ λ§€λ² μ κ°μ²΄λ₯Ό μΈμ€ν΄μ€νν΄μΌ νκ³ , μ½λ μ 체μμ νμ config_path
μμμΌ ν©λλ€. RQμ λν λ¬Έμλ λͺ
μ μ μΌλ‘ λ΄κ° _instanceμ method_λ₯Ό μ¬μ©ν μ μλ€κ³ μ¬κΈ° , λ΄κ° λ°λΌκ³ μμλμ§ κ·Έμ μλλ‘. λ€λ₯Έ ν΄κ²° λ°©λ²μ λν΄ μ΄λ € μμ§λ§ μ¬κΈ°μμ ν΄λμ€ λ©μλλ₯Ό μ°μν λ°©μμΌλ‘ μ¬μ©νλ λ°©λ²μ΄λ μ²μλΆν° ν΄λμ€ λ©μλλ₯Ό μ¬μ©ν΄μΌ νλ μ΄μ λ₯Ό λͺ¨λ₯΄κ² μ΅λλ€.
@EliFinkelshteyn , μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ λ self.mysql_connector.get_mysql_connection()
μ¬μ©ν μ μμ΅λλ€. μ°λ¦¬λ ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λΉλνκ³ mysql μ°κ²° κ°μ²΄λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
μ΄μ λν λμ κ°μΈμ μΈ ν΄κ²°μ± μ db μ°κ²° ν΄λμ€λ₯Ό μ±κΈν€μΌλ‘ λ§λ€μ΄ λ§€λ² μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μλλ‘ νλ κ²μ λλ€.
from sqlalchemy.engine import create_engine
class MySQL(object):
_Instances = dict()
def __new__(self):
if 'Instance' in MySQL._Instances:
return MySQL._Instances['Instance']
else:
self.Engine = create_engine(
'mysql+mysqldb://User:Password<strong i="9">@Host</strong>:3306/dbname?charset=utf8&use_unicode=0',
pool_size=10
).connect()
return super(MySQL,self).__new__(self)
def __init__(self):
MySQL._Instances['Instance'] = self
μ°λ¦¬λ Pythonμ pickle
λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό Redisλ‘ μ§λ ¬ννκ³ pickle
λ μΈμ€ν΄μ€ λ©μλλ₯Ό μ€μ λ‘ νΌν΄ν μ μμ΅λλ€. μΈμ€ν΄μ€ λ©μλλ₯Ό 맀κ°λ³μλ‘ μ¬μ©νμ§ μλλ‘ ν¨μλ₯Ό λ€μ μμ±νλ κ²μ΄ μ’μ΅λλ€.
@EliFinkelshteyn λλ λΉμ μ΄ μ΄λ»κ² νλμ§ μκ³ μΆμ΅λλ€. μ λ κ°μ κ²½μ°μ ν΄λμ€λ₯Ό λ€μ μμ±νκ³ μΆμ§ μμ΅λλ€.
λλ μΌμ’ μ μν©μ μ²ν΄ μλλ° μ°¨μ΄μ μ @staticmethod μ£ΌμμΌλ‘ (μ μ ) λ©μλλ₯Ό νΌν΄νκΈ° μν΄ rqλ₯Ό μ»μ μ μλ€λ κ²μ λλ€. μ΄λ€ μ μ?
μ§λ ¬ν ν΄κ²° λ°©λ²μ μ°Ύλ μ¬λλ€μ μν΄ Pythonμ __getstate__
λ° __setstate__
νμ¬ μ§λ ¬ν λ° μμ§λ ¬νλ₯Ό μ μ΄ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ μ¬μ©νλ©΄ λ€μ μ°κ²°νκΈ°μ μΆ©λΆν μ 보(μ: μ°κ²° URL)λ₯Ό μ μ₯ν μ μμ§λ§ μ§λ ¬ννκΈ° μ μ λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ체λ₯Ό None μΌλ‘ μ€μ ν μ μμ΅λλ€( __getstate__
). λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ __setstate__
μμ μ¬κ΅¬μ±ν μ μμ΅λλ€.
μ: https://docs.python.org/3/library/pickle.html#pickle -state
κ³Όκ±°μ λ€μ€ μ²λ¦¬ λͺ¨λκ³Ό ν¨κ» μ΄ μ κ·Ό λ°©μμ μ¬μ©ν μ μ΄ μμ΅λλ€. λ°©κΈ μΈμ€ν΄μ€μ λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ΄ μκ³ μλνλ κ²μΌλ‘ 보μ΄λ μΈμ€ν΄μ€ λ©μλλ₯Ό RQ νΌν΄λ§μΌλ‘ ν μ€νΈνμ΅λλ€.
μ μ λ©μλλ₯Ό μ¬μ©νμ§ μμμ§λ§ νΌν΄ κ°λ₯ν μ μ λ©μλμ λν μΈν°λ· κ²μμ μ’μ κ²°κ³Όλ₯Ό μ»μμ΅λλ€. https://stackoverflow.com/questions/1914261/pickling-a-staticmethod-in-python
κ°μ₯ μ μ©ν λκΈ
λλ μΌμ’ μ μν©μ μ²ν΄ μλλ° μ°¨μ΄μ μ @staticmethod μ£ΌμμΌλ‘ (μ μ ) λ©μλλ₯Ό νΌν΄νκΈ° μν΄ rqλ₯Ό μ»μ μ μλ€λ κ²μ λλ€. μ΄λ€ μ μ?