編程學(xué)習(xí)網(wǎng) > PHP技術(shù) > swoole > 提升格調(diào)神器,swoole多線程網(wǎng)絡(luò)爬蟲了解一下!
2021
08-10

提升格調(diào)神器,swoole多線程網(wǎng)絡(luò)爬蟲了解一下!


對于網(wǎng)絡(luò)爬蟲,相比大家已經(jīng)并不陌生了,大家時(shí)常寫的都是串行爬蟲,已經(jīng)爛大街了,平庸而緩慢的爬蟲可能不足以滿足聰明的你,所以,今天想給大家簡單介紹一下更“高大上”的爬蟲——多線程網(wǎng)絡(luò)爬蟲。

何為進(jìn)程、線程、多線程?

進(jìn)程:進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它是操作系統(tǒng)動(dòng)態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中,進(jìn)程既是基本的分配單元,也是基本的執(zhí)行單元。

線程:不擁有系統(tǒng)資源,故對它的調(diào)度所付出的開銷就會(huì)小得多,能更高效的提高系統(tǒng)多個(gè)程序間并發(fā)執(zhí)行的程度。

多線程:在一個(gè)程序中,這些獨(dú)立運(yùn)行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理”。多線程是為了同步完成多項(xiàng)任務(wù),不是為了提高運(yùn)行效率,而是為了提高資源使用效率來提高系統(tǒng)的效率。線程是在同一時(shí)間需要完成多項(xiàng)任務(wù)的時(shí)候?qū)崿F(xiàn)的。

舉個(gè)例子就是:我打開了QQ,此時(shí),啟動(dòng)了一個(gè)進(jìn)程(即QQ),給A發(fā)了一條語音,啟動(dòng)了該進(jìn)程中的一個(gè)線程;然后又給B發(fā)了一個(gè)表情,此時(shí)我又啟動(dòng)了一個(gè)線程。這就是進(jìn)程、線程、多線程的一個(gè)最簡單的例子。

php中的多線程

PHP 默認(rèn)并不支持多線程,要使用多線程需要安裝 pthread 擴(kuò)展,而要安裝 pthread 擴(kuò)展,必須使用 --enable-maintainer-zts 參數(shù)重新編譯 PHP,這個(gè)參數(shù)是指定編譯 PHP 時(shí)使用線程安全方式。而在swoole中,php可以借助其啟動(dòng)子進(jìn)程的方式,實(shí)現(xiàn)php的多進(jìn)程:


<?php 
echo '開始時(shí)間:'.date('H:i:s',time());
//進(jìn)程數(shù)
$work_number=6;
 
//
$worker=[];
 
//模擬地址
$curl=[
	'https://blog.csdn.net/feiwutudou',
	'https://wiki.swoole.com/wiki/page/215.html',
	'http://fanyi.baidu.com/?aldtype=16047#en/zh/manager',
	'http://wanguo.net/Salecar/index.html',
	'http://o.ngking.com/themes/mskin/login/login.jsp',
	'https://blog.csdn.net/marksinoberg/article/details/77816991'
];
 
//單線程模式
// foreach ($curl as $v) {
// 	echo curldeta($v);
// }
 
//創(chuàng)建進(jìn)程
for ($i=0; $i < $work_number; $i++) { 
	//創(chuàng)建多線程
	$pro=new swoole_process(function(swoole_process $work) use($i,$curl){
		//獲取html文件
		$content=curldeta($curl[$i]);
		//寫入管道
		$work->write($content.PHP_EOL);
	},true);
	$pro_id=$pro->start();
	$worker[$pro_id]=$pro;
}
//讀取管道內(nèi)容
foreach ($worker as $v) {
 	echo $v->read().PHP_EOL;
}
 
//模擬爬蟲
function curldeta($curl_arr)
{	//file_get_contents
	echo $curl_arr.PHP_EOL;
	file_get_contents($curl_arr);
}
 
//進(jìn)程回收
swoole_process::wait();
 
echo '結(jié)束時(shí)間:'.date('H:i:s',time());
 
 ?>
多進(jìn)程執(zhí)行結(jié)果



以上就是“提升格調(diào)神器,swoole多線程網(wǎng)絡(luò)爬蟲了解一下!”的詳細(xì)內(nèi)容,想要了解更多swoole教程歡迎關(guān)注編程學(xué)習(xí)網(wǎng)

掃碼二維碼 獲取免費(fèi)視頻學(xué)習(xí)資料

Python編程學(xué)習(xí)

查 看2022高級編程視頻教程免費(fèi)獲取