【正文】
。()20. 21. startnum_threadsthreads22. foriinrange(num_threads):23. t=Thread(target=pingme,args=(i,q))24. (True)25. ()26. 27. foripinips:28. (ip)29. print39。mainthreadwaiting...39。30. ()。print39。Done39。在上面代碼中使用subprocess的主要好處是,使用多個(gè)線程來執(zhí)行ping命令會(huì)節(jié)省大量時(shí)間。假設(shè)說我們用一個(gè)線程來處理,那么每個(gè) ping都要等待前一個(gè)結(jié)束之后再ping其他地址。那么如果有100個(gè)地址,一共需要的時(shí)間=100*平均時(shí)間。如果使用多個(gè)線程,那么最長執(zhí)行時(shí)間的線程就是整個(gè)程序運(yùn)行的總時(shí)間?!緯r(shí)間比單個(gè)線程節(jié)省多了】這里要注意一下Queue模塊的學(xué)習(xí)。pingme函數(shù)的執(zhí)行是這樣的:啟動(dòng)的線程會(huì)去執(zhí)行pingme函數(shù)。pingme函數(shù)會(huì)檢測隊(duì)列中是否有元素。如果有的話,則取出并執(zhí)行ping命令。這個(gè)隊(duì)列是多個(gè)線程共享的。所以這里我們不使用列表。【假設(shè)在這里我們使用列表,那么需要我們自己來進(jìn)行同步控制。Queue本身已經(jīng)通過信號(hào)量做了同步控制,節(jié)省了我們自己做同步控制的工作=。=】代碼中q的join函數(shù)是阻塞當(dāng)前線程。下面是e文注釋 () Blocks until all items in thequeuehave been gotten and processed(task_done()).學(xué)習(xí)Processing模塊的時(shí)候,遇到了進(jìn)程的join函數(shù)。進(jìn)程的join函數(shù)意思說,等待進(jìn)程運(yùn)行結(jié)束。與這里的Queue的join有異曲同工之妙啊。processing模塊學(xué)習(xí)的文章在這里