AttributeError: No se puede encoger el cálculo del objeto local .. function1 utilizando la cola de multiprocesamiento

Tengo el siguiente código usando el progtwigdor y el módulo de multiprocesamiento:

def computation(): def function1(q): while True: daydate = datetime.now() number = random.randrange(1, 215) print('Sent to function2: ({}, {})'.format(daydate, number)) q.put((daydate, number)) time.sleep(2) def function2(q): while True: date, number = q.get() print("Recevied values from function1: ({}, {})".format(date, number)) time.sleep(2) if __name__ == "__main__": q = Queue() a = Process(target=function1, args=(q,)) a.start() b = Process(target=function2, args=(q,)) b.start() a.join() b.join() schedule.every().monday.at("08:45").do(computation) schedule.every().tuesday.at("08:45").do(computation) while True: schedule.run_pending() time.sleep(1) 

Sin embargo, mientras se ejecuta el código da el siguiente error:

AttributeError: No se puede encoger el cálculo del objeto local .. function1

Y:

OSError: [WinError 87] El parámetro es incorrecto

    ¿Cómo se resuelve este problema? He intentado resolver esto definiendo una función en el nivel superior de un módulo como se indica en los documentos ( https://docs.python.org/2/library/pickle.html#what-can-be-pickled- y sin desencadenar ) sin embargo, todavía da el mismo error.

    Las funciones anidadas no son funciones definidas en el nivel superior, por lo que recibe el error. Debe reubicar la definición de function1 y function2 fuera del cálculo.

    Cómo lo escribió, sus procesos se iniciarían inmediatamente en lugar de la fecha en que los programó para ejecutarse. Eso probablemente hace lo que pretendías:

     import os import time import random from multiprocessing import Process, Queue from threading import Thread from datetime import datetime import schedule def function1(q): while True: daydate = datetime.now() number = random.randrange(1, 215) fmt = '(pid: {}) Sent to function2: ({}, {})' print(fmt.format(os.getpid(), daydate, number)) q.put((daydate, number)) time.sleep(2) def function2(q): while True: date, number = q.get() fmt = "(pid: {}) Received values from function1: ({}, {})" print(fmt.format(os.getpid(), date, number)) # time.sleep(2) no need to sleep here because q.get will block until # new items are available def computation(): q = Queue() a = Process(target=function1, args=(q,)) a.start() b = Process(target=function2, args=(q,)) b.start() a.join() b.join() if __name__ == "__main__": # We are spawning new threads as a launching platform for # computation. Without it, the next job couldn't start before the last # one has finished. If your jobs always end before the next one should # start, you don't need this construct and you can just pass # ...do(computation) schedule.every().friday.at("01:02").do( Thread(target=computation).start ) schedule.every().friday.at("01:03").do( Thread(target=computation).start ) while True: schedule.run_pending() time.sleep(1) 

    Tal como está ahora, sus procesos se ejecutarán para siempre después de que se inicien una vez. Si eso no es lo que desea, debe pensar en implementar alguna condición de detención.