Rq: рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдПрдирдХреНрдпреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 22 рд╕рд┐рддре░ 2015  ┬╖  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.

@ рдЬреЙрди рд╕реБрдВрджрд░рд░рд╛рдЬ , рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдХреИрд╕реЗ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрдпрд╛ рд╣реИ:

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 рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрд░рдХреНрдпреВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдВ _instance method_

@EliFinkelshteyn , рдПрдХ рдЙрджрд╛рд╣рд░рдг self.mysql_connector.get_mysql_connection() рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдФрд░ MySQL рдХрдиреЗрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдорд╛рдзрд╛рди, рдбреАрдмреА рдХрдиреЗрдХреНрд╢рди рдХреНрд▓рд╛рд╕ рдХреЛ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдирд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рд╣рд░ рдмрд╛рд░ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рди рдмрдирд╛рдПрдВред

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

рд╣рдо рд░реЗрдбрд┐рд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдХреЗ pickle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ pickle рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╡рд┐рдзрд┐ рдХреЛ рдЕрдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдпрд╣ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рди рд▓реЗред

@EliFinkelshteyn рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдореИрдВ рдЙрд╕реА рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реВрдВ, рдФрд░ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрд╕реБрдХ рдирд╣реАрдВ рд╣реВрдВред

рдореИрдВ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реВрдВ, рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ @staticmethod рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ (рд╕реНрдерд┐рд░) рд╡рд┐рдзрд┐ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП rq рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рд╕реБрдЭрд╛рд╡?

рд╕реАрд░рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк Python рдХреЗ __getstate__ рдФрд░ __setstate__ рд╕рд╛рде serializaton рдФрд░ deserialization рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде, рдЖрдк рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди URL), рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рдирд╣реАрдВ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ ( __getstate__ )ред рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ __setstate__ рдореЗрдВ рдкреБрдирд░реНрдЧрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг: https://docs.python.org/3/library/pickle.html#pickle -state

рдореИрдВрдиреЗ рдЕрддреАрдд рдореЗрдВ рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕реЗ рдЖрд░рдХреНрдпреВ рдХреЗ рд╕рд╛рде рдПрдХ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╡рд┐рдзрд┐ рдЪреБрдирдиреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪрд╛рд░ рдпреЛрдЧреНрдп рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреБрдЧрд▓рд┐рдВрдЧ рдПрдХ рдЕрдЪреНрдЫреА рд▓реАрдб рдХреЗ рд╕рд╛рде рдЖрддреА рд╣реИ: https://stackoverflow.com/questions/1914261/pickling-a-staticmethod-in-python

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

anseljh picture anseljh  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

anduingaiden picture anduingaiden  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MW3000 picture MW3000  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Angi2412 picture Angi2412  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

nvie picture nvie  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ