我正在开发一个简单的多线程网络爬虫。我正在使用 sqlite 数据库来存储将被扫描的 url。我只有一个数据库句柄问题是主线程查询数据库以产生新线程。线程正在访问相同的句柄,但主线程还。
我已经为每个线程定义了关键部分,包括主线程。但是即使线程也处于临界区,主线程也会继续执行代码。
这是一些代码:
CreateDb;
InitializeCriticalSection(critical);
index := 0;
repeat
if threads < THREADS_MAX then
begin
EnterCriticalSection(critical);
try
sqldb.query('SELECT * FROM urls WHERE vizitat=0 AND id>' + IntToStr(index));
urlcount:= sqldb.rowcount;
for i:= 1 to urlcount do
begin
WriteLn(sqldb.Fs('adresa'));
sqldb.next;
index := sqldb.Fi('id');
with TPageCrawl.Create(@threads,sqldb.Fs('adresa'),index,sqldb) do;
if threads = THREADS_MAX then break;
end;
LeaveCriticalSection(critical);
except
LeaveCriticalSection(critical);
Continue;
end;
end;
Write(logo);
Sleep(1000);
until (threads = 0) and (urlcount < 1);