Если вы хотите, чтобы все экземпляры mainfunc
использовали один и тот же объект KeySeq
, вы можете использовать трюк со значением параметра по умолчанию:
def mainfunc(ks=KeySeq()):
key = ks.next()
Пока вы на самом деле не передаете значение ks
, все вызовы mainfunc
будут использовать экземпляр KeySeq
, созданный при определении функции.
Вот почему, если вы не знаете: функция - это объект. У него есть атрибуты. Один из его атрибутов называется func_defaults
; это кортеж, содержащий значения по умолчанию всех аргументов в его сигнатуре, которые имеют значения по умолчанию. Когда вы вызываете функцию и не предоставляете значение для аргумента, который имеет значение по умолчанию, функция извлекает значение из func_defaults
. Поэтому, когда вы вызываете mainfunc
без указания значения для ks
, он получает экземпляр KeySeq()
из кортежа func_defaults
. Который, для этого экземпляра mainfunc
, всегда один и тот же KeySeq
экземпляр.
Теперь вы говорите, что собираетесь отправить «несколько экземпляров mainfunc
в submit
функцию PP». Вы действительно имеете в виду несколько экземпляров? Если так, то механизм, который я описываю, не будет работать.
Но сложно создать несколько экземпляров функции (а код, который вы опубликовали, - нет). Например, эта функция возвращает новый экземпляр g
каждый раз, когда она вызывается:
>>> def f():
def g(x=[]):
return x
return g
>>> g1 = f()
>>> g2 = f()
>>> g1().append('a')
>>> g2().append('b')
>>> g1()
['a']
>>> g2()
['b']
Если я вызываю g()
без аргумента, он возвращает значение по умолчанию (изначально пустой список) из своего кортежа func_defaults
. Поскольку g1
и g2
являются разными экземплярами функции g
, их значение по умолчанию для аргумента x
равно , а также другому экземпляру, который демонстрируется выше.
Если вы хотите сделать это более явным, чем использовать хитрый побочный эффект значений по умолчанию, вот еще один способ сделать это:
def mainfunc ():
если не hasattr (mainfunc, "ks"):
setattr (mainfunc, "ks", KeySeq ())
key = mainfunc.ks.next ()
Наконец, очень важный момент, который пропускает код, который вы разместили: если вы собираетесь выполнять параллельную обработку совместно используемых данных, код, который касается этих данных, должен реализовать блокировку. Посмотрите на пример callback.py
в документации по Parallel Python и посмотрите, как блокировка используется в классе Sum
и почему.