Параметры копирования пула потоков Python - PullRequest
0 голосов
/ 27 августа 2018

Я изучаю многопоточность и пытаюсь реализовать несколько вещей, чтобы понять это.После прочтения нескольких (и очень технических тем) я не могу найти решение или способ понять мою проблему.

По сути, у меня есть следующая структура:

class MyObject():
    def __init__():
        self.lastupdate = datetime.datetime.now()
    def DoThings():
        ...

def MyThreadFunction(OneOfMyObject):
    OneOfMyObject.DoThings()
    OneOfMyObject.lastupdate = datetime.datetime.now()

def main():
    MyObject1 = MyObject()
    MyObject2 = MyObject()
    MyObjects = [MyObject1, MyObject2]

    pool = Pool(2)

    while True:
        pool.map(MyThreadFunction, MyObjects)

if __name__ == '__main__':
    main()

Я думаю, что функция .mapсделайте копию моих объектов, потому что это не обновляет время.Это правильно ?если да, как я могу ввести глобальную версию своих объектов.Если нет, то могли бы вы понять, почему в моих объектах установлено время?

Когда я проверяю новое время с печатью (MyObject.lastupdate), время подходит, но не в следующем цикле

Большое спасибо за любые ваши идеи

1 Ответ

0 голосов
/ 27 августа 2018

Да, потоки Python будут сериализовывать (на самом деле, обрабатывать) ваши объекты, а затем реконструировать их в потоке.Тем не менее, он также отправляет их обратно.Чтобы восстановить их, см. Прокомментированные дополнения к коду ниже:

class MyObject():
    def __init__():
        self.lastupdate = datetime.datetime.now()
    def DoThings():
        ...

def MyThreadFunction(OneOfMyObject):
    OneOfMyObject.DoThings()
    OneOfMyObject.lastupdate = datetime.datetime.now()

    # NOW, RETURN THE OBJECT
    return oneOfMyObject

def main():
    MyObject1 = MyObject()
    MyObject2 = MyObject()
    MyObjects = [MyObject1, MyObject2]

    with Pool(2) as pool: # <- this is just a neater way of doing it than a while loop for various reasons. Checkout context managers if interested.

        # Now we recover a list of the updated objects:
        processed_object_list = pool.map(MyThreadFunction, MyObjects)

    # Now inspect
    for my_object in processed_object_list:
            print(my_object.lastupdate)


if __name__ == '__main__':
    main()
...