aaarandomer
aaarandomer

Reputation: 1

Multiprocessing AttributeError: Can't get attribute 'do_something' on <module '__mp_main__'

AttributeError: Can't get attribute 'do_something' on <module '__mp_main__' from 'x.py'>

When I run my code I got this error message in the terminal. I've tried everything, I searched on Google and asked at AI answer generating websites and it still doesn't work.

This is my code:

import multiprocessing
import time

if __name__ == '__main__':
    start = time.perf_counter()

    def do_something():
        print('Sleeping 1 second...')
        time.sleep(1)
        print('Done sleeping...')

    p1 = multiprocessing.Process(target=do_something)
    p2 = multiprocessing.Process(target=do_something)

    p1.start()
    p2.start()

    # Call join() to wait for processes to finish running
    p1.join()
    p2.join()

    finish = time.perf_counter()

    print(f'Finished in {round(finish-start, 2)} second(s)')

The code is supposed to print:

Sleeping 1 second...
Sleeping 1 second...
Done sleeping...
Done sleeping...
Finished in 1 second(s)

Upvotes: 0

Views: 806

Answers (1)

darren
darren

Reputation: 5744

The main guard if __name__ == '__main__': was invoked too early.

So something like this works:

import time
import multiprocessing

def do_something():
    print('Sleeping 1 second...')
    time.sleep(1)
    print('Done sleeping...')

start = time.perf_counter()


if __name__ == '__main__':
    p1 = multiprocessing.Process(target=do_something)
    p2 = multiprocessing.Process(target=do_something)


    p1.start()
    p2.start()

    # Call join() to wait for processes to finish running
    p1.join()
    p2.join()

    finish = time.perf_counter()

    print(f'Finished in {round(finish-start, 2)} second(s)')

The result:

Sleeping 1 second...
Sleeping 1 second...
Done sleeping...
Done sleeping...
Finished in 2.6 second(s)

Link to the docs: https://docs.python.org/3/library/multiprocessing.html

Upvotes: 1

Related Questions