Я пишу короткую программу, где я хочу вызвать функцию асинхронно, чтобы она не блокировала вызывающего. Для этого я использую Pool
из модуля multiprocessing
python.Python namedtuple как аргумент обратного вызова apply_async (..)
В вызываемой функции асинхронно Я хочу вернуть namedtuple
в соответствии с логикой остальной частью моей программы, но я нахожу, что namedtuple
не кажется, поддерживаемый типа, чтобы перейти от порожденного процесса к обратному вызову (вероятно, потому, что он не может быть маринован). Вот минимальный реестр проблемы.
from multiprocessing import Pool
from collections import namedtuple
logEntry = namedtuple("LogEntry", ['logLev', 'msg'])
def doSomething(x):
# Do actual work here
logCode = 1
statusStr = "Message Here"
return logEntry(logLev=logCode, msg=statusStr)
def callbackFunc(result):
print(result.logLev)
print(result.msg)
def userAsyncCall():
pool = Pool()
pool.apply_async(doSomething, [1,2], callback=callbackFunc)
if __name__ == "__main__":
userAsyncCall() # Nothing is printed
# If this is uncommented, the logLev and status are printed as expected:
# y = logEntry(logLev=2, msg="Hello World")
# callbackFunc(y)
Кто-нибудь знает, если есть способ передать значение namedtuple
возвращения из процесса асинхронного обратного вызова? Есть ли лучший/более питонический подход к тому, что я делаю?
* Как определено *, ваш названный кортеж может быть маринованные просто отлично. См. [Как правильно сортировать экземпляр namedtuple] (// stackoverflow.com/q/16377215) –