UPDATED
I've made some changes to the code after reading your comment. Probably not a great way to do it, but basically, I fork out another process that will poll the shared dictionary at some interval and update the console output. Note that this will clear the entire console while it updates. Hopefully this is the expected behavior.
The code:
from multiprocessing import Lock, Process, Pool, Manager
import time
def run(user,logs):
logs[user] += ['Message 1 for user: ' + user]
time.sleep(2) #some work done per user
logs[user] += ['Message 2 for user: ' + user]
return 1
manager = Manager()
logs = manager.dict()
users = ['Tom', 'Bob', 'Dinesh', 'Ravi']
for user in users:
logs[user] = [] #initialize empty list for each user
logs_list = [logs for i in range(len(users))]
def poll(logs):
while True:
print("\033c") #clear the console
for user in logs.keys():
print('Logs for user:', user)
print('\n'.join(logs[user]))
print('----------------')
time.sleep(0.1)
poller_process = Process(target=poll, args=(logs,))
poller_process.start()
p = Pool(4)
p.starmap(run, zip(users,logs_list))
p.close()
p.join()
poller_process.join()
------
Output #logs under each user are refreshed constantly
------
Logs for user: Tom
Message 1 for user: Tom
Message 2 for user: Tom
----------------
Logs for user: Bob
Message 1 for user: Bob
Message 2 for user: Bob
----------------
Logs for user: Dinesh
Message 1 for user: Dinesh
Message 2 for user: Dinesh
----------------
Logs for user: Ravi
Message 1 for user: Ravi
Message 2 for user: Ravi
----------------
This may not be a very elegant approach, but it works. You can try aggregating the results from each process against a 'user' key in a shared dictionary. You can then iterate over the dictionary after the pool.join()
and print all the results in order. This will elimate the need for the locks.
The code looks something like this:
from multiprocessing import Lock, Process, Pool, Manager
import time
def run(user,logs):
logs[user] += ['Message 1 for user: ' + user]
time.sleep(1) #some work done per user
logs[user] += ['Message 2 for user: ' + user]
return 1
manager = Manager()
logs = manager.dict()
users = ['Tom', 'Bob', 'Dinesh', 'Ravi']
for user in users:
logs[user] = [] #initialize empty list for each user
logs_list = [logs for i in range(len(users))]
p = Pool(4)
p.starmap(run, zip(users,logs_list))
p.close()
p.join()
for user in logs.keys():
print(logs[user])
------
Output:
------
['Message 1 for user: Tom', 'Message 2 for user: Tom']
['Message 1 for user: Bob', 'Message 2 for user: Bob']
['Message 1 for user: Dinesh', 'Message 2 for user: Dinesh']
['Message 1 for user: Ravi', 'Message 2 for user: Ravi']