Indeed there is a bottleneck. IDKit.Find locks structure of all User objects so that fingerprints cannot be added/removed while some identification is in progress. And of course User.Add also needs this lock. The way to solve this problem is to run only Fingerprint constructor in thread1 and run both User.Add and IDKit.Find in thread2. User.Add is a fast operation. The expensive template extraction is performed in Fingerprint constructor.