【正文】
。()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的主要好處是,使用多個線程來執(zhí)行ping命令會節(jié)省大量時間。假設(shè)說我們用一個線程來處理,那么每個 ping都要等待前一個結(jié)束之后再ping其他地址。那么如果有100個地址,一共需要的時間=100*平均時間。如果使用多個線程,那么最長執(zhí)行時間的線程就是整個程序運行的總時間?!緯r間比單個線程節(jié)省多了】這里要注意一下Queue模塊的學(xué)習(xí)。pingme函數(shù)的執(zhí)行是這樣的:啟動的線程會去執(zhí)行pingme函數(shù)。pingme函數(shù)會檢測隊列中是否有元素。如果有的話,則取出并執(zhí)行ping命令。這個隊列是多個線程共享的。所以這里我們不使用列表。【假設(shè)在這里我們使用列表,那么需要我們自己來進行同步控制。Queue本身已經(jīng)通過信號量做了同步控制,節(jié)省了我們自己做同步控制的工作=。=】代碼中q的join函數(shù)是阻塞當前線程。下面是e文注釋 () Blocks until all items in thequeuehave been gotten and processed(task_done()).學(xué)習(xí)Processing模塊的時候,遇到了進程的join函數(shù)。進程的join函數(shù)意思說,等待進程運行結(jié)束。與這里的Queue的join有異曲同工之妙啊。processing模塊學(xué)習(xí)的文章在這里