Читай документацию:
>>> help(Process.join)
join(self, timeout=None)
Wait until child process terminates
Это значит, что интерпретатор будет ждать пока процесс закончится.
То есть ты в своем коде на самом деле выполняешь все последовательно.
А тебе надо писать что-то такое:
from multiprocessing import Process
from time import sleep
def worker(n):
print("the worker went to the office")
sleep(n)
print("the worker has been walking for %d sec" % n)
if __name__ == "__main__":
plist = []
for i in range(4, 0, -1):
proc = Process(target=worker, args=(i,))
plist.append(proc)
for proc in plist:
proc.start()
Это возвратит:
the worker went to the office
the worker went to the office
the worker went to the office
the worker went to the office
the worker has been walking for 1 sec
the worker has been walking for 2 sec
the worker has been walking for 3 sec
the worker has been walking for 4 sec
И да, процессы и потоки вещи совсем разные. С потоками работать намного удобнее. Так почему бы не использовать их.