I would put a Job Model Object for every report into the database.
Each Job Model has a state (processing and finished).
If you make your calculation, maybe you can put also the result into the Job Object, so you have anything in one place.
When a job is running, and you have the data, you could save also the percentage how much is already done.
You can then display to the user B (maybe you refresh the page with a meta-refresh) so the user can see the progress.
As the User A did start the job asynchronously, it should not block the requests of User B.
Finally I would think about an max. allowed running time for an task and stop the job if it runs to long.
Best,
Allen