Rq: μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό λŒ€κΈ°μ—΄μ— 넣을 수 μ—†μŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2015λ…„ 09μ›” 22일  Β·  7μ½”λ©˜νŠΈ  Β·  좜처: rq/rq

이것은 λ‚΄κ°€ 말할 μˆ˜μžˆλŠ” ν•œ κ²°μ½” ν•΄κ²°λ˜μ§€ μ•Šμ€ 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

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‚˜λŠ” μΌμ’…μ˜ 상황에 μ²˜ν•΄ μžˆλŠ”λ° 차이점은 @staticmethod μ£Όμ„μœΌλ‘œ (정적) λ©”μ„œλ“œλ₯Ό ν”Όν΄ν•˜κΈ° μœ„ν•΄ rqλ₯Ό 얻을 수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ–΄λ–€ μ œμ•ˆ?

λͺ¨λ“  7 λŒ“κΈ€

@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

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰