我们都知道并发(不是并行)编程目前有四种方式多进程,多线程异步,和协程
多进程编程在python携程中有类似C的/
运行python携程3 thread.py
命令查看效果(记得先開网站服务器):
使用ThreadPool
时它处理的对象可以不是线程对象,实际上Fetcher
的线程部分ThreadPool
根本用不到因为它自己内部已开了几个线程在等待任务輸入。这里偷个懒就只把self.start()
去掉了可以把Fetcher
的线程部分全去掉,效果是一样的
ThreadPool
活用了map
函数,这里它将每一个Fetcher
对象分配给线程池中的一个线程线程调用了Fetcher
的run
函数。这里使用map_async
是因为不希望它在那一步阻塞我们希望在任务队列join
的地方阻塞,那么到队列为空且任务全部处理完时程序就会继续执行了
我们希望爬虫的性能能够进一步提升,但是我们没办法开太多的线程因为线程的内存开销很大,每创建一个线程鈳能需要占用50k的内存以及还有一点,网络程序的时间开销往往花在I/O上socket I/O 阻塞时的那段时间是完全被浪费了的。那么要如何解决这个问题呢
下节课你就知道啦,下节课见~