KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I am working in a Django web application which needs to query a PostgreSQL database. When implementing concurrency using Python threading interface, I am getting DoesNotExist errors for the queried items. Of course, these errors do not occur when performing the queries sequentially. Let me show a unit test which I wrote to demonstrate the unexpected behavior: class ThreadingTest(TestCase): fixtures = ['demo_city',] def test_sequential_requests(self): """ A very simple request to database, made sequentially. A fixture for the cities has been loaded above. It is supposed to be six cities in the testing database now. We will made a request for each one of the cities sequentially. """ for number in range(1, 7): c = City.objects.get(pk=number) self.assertEqual(c.pk, number) def test_threaded_requests(self): """ Now, to test the threaded behavior, we will spawn a thread for retrieving each city from the database. """ threads = [] cities = [] def do_requests(number): cities.append(City.objects.get(pk=number)) [threads.append(threading.Thread(target=do_requests, args=(n,))) for n in range(1, 7)] [t.start() for t in threads] [t.join() for t in threads] self.assertNotEqual(cities, []) As you can see, the first test performs some database requests sequentially, which are indeed working with no problem. The second test, however, performs exactly the same requests but each request is spawned in a thread. This is actually failing, returning a DoesNotExist exception. The output of the execution of this unit tests is like this: test_sequential_requests (cesta.core.tests.threadbase.ThreadingTest) ... ok test_threaded_
Tags (comma-separated)
Save Edits
Cancel