Re: Not the first piece of absurd preaching to come from the SQLite team
Threads are problematic because they can cause a lot of annoying race condition/concurrency problem things. That doesn't make them evil any more than the compiler is evil because it optimizes code into a method that makes it hard to debug, or the operating system is evil because it limits the number of open files you can have. They work in some way, and they each have a reason to do so.
Threads are useful over processes because your code is more united; you can create threads that are nicely connected to a codebase while multiprocessing is uglier. Threads let you have interactions between each other whereas processes don't have convenient communication mechanisms (sighup is not enough). To communicate between processes, you usually have to create your system yourself and it's slower.
As for SQLite, I typically use it only as a convenient type of data storage, or for an application that needs a local database inside itself. For real database requirements, it's not going to have enough features or capacity.