我在Python中创建一个Web爬虫,它收集重定向/链接,将它们添加到数据库,如果链接不存在则将它们作为新行输入。我想使用多线程但有麻烦,因为我必须实时检查是否有一个给定URL的条目。
我最初使用sqlite3
,但意识到我无法在不同的线程上同时使用它。我不想使用MySQL(或类似的东西),因为它需要更多的磁盘空间并作为单独的服务器运行。有没有让sqlite3
使用多个线程?
答案 0 :(得分:5)
Python sqlite3
模块的threadsafety
级别为1,这意味着虽然您无法在线程之间共享数据库连接,但多个线程可以使用模块同时进行。因此,可以让每个线程创建自己的数据库连接。
这种方法的问题在于SQLite的写入并发性很差,因此让多个线程一次执行大量INSERT
s会给你带来可怕的“数据库被锁定”错误。你可以使用PRAGMA JOURNAL_MODE = 'WAL'
来改善一些事情,但这只是到目前为止。
如果性能问题并且切换到客户端 - 服务器数据库不是一个选项,那么您可能需要做的就是保留URL的内存缓存,并安排您的程序这样你就有了一个线程,可以将这个缓存与SQLite数据库同步。
答案 1 :(得分:0)
一种解决方案可能是获取一个锁,直接从您的程序访问数据库。通过这种方式,多个线程或进程将在执行请求之前等待其他进程插入链接。