У меня есть код, подобный следующему:
import multiprocessing as mp
connection: module.Connection
def client_id():
for i in range(mp.cpu_count*2):
yield i
def initproc(host: str, port: int, client_id: int):
global connection
connection.connect(host, port, client_id)
def main():
host = "something"
port = 12345
mp.get_context("spawn").Pool(processes=mp.cpu_count()*2,
initializer=initproc,
initargs=(host, port, client_id())) as p:
res = p.starmap(processing_function, arg_list)
для целей вопроса processing_function и arg_list не имеют значения.
Проблема в том, что я получаю сообщение об ошибке:
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle 'generator' object
Есть ли способ создать процесс инициализации в пуле таким образом, чтобы один из аргументов для его инициализации был бы следующим числом в последовательности?
P.S. В коде, как написано, может быть возможно инициализировать все объекты соединения за пределами функции инициализатора, но в моем конкретном случае это не так. Мне нужно передать аргументы для подключения в инициализатор.
global
иmultiprocessing
не смешиваются — у вас будет новыйconnection
в каждом процессе.initproc
говорит, что ожидаетclient_id: int
, но вместо этого вы передаетеclient_id: Iterable[int]
(посколькуclient_id()
является генератором). Наконец, что вы собираетесь делать в концеas p
? - person MisterMiyagi   schedule 24.08.2020as p
позволяет обращаться к объекту пула как к переменнойp
.global
необходим, потому что в противном случае переменнаяconnection
будет локальной внутри функции и не будет доступна из функций обработки данных.Iterable
или нет, я даже не дошел до того, чтоinitproc
получает значение для обработки - person Karlson   schedule 24.08.2020