1
macleek OP 还有个一个问题,如何抓取带有时间戳的图片呢,比如这样一个url http://xxxxcom/GraphServlet?graphId=100020&time=1376306512081
|
2
yangg 2013-08-12 19:49:28 +08:00
urls = ['http://url/' % i for i in range(1, 1000000)]
pool = multiprocessing.Pool(50) res = pool.map(dosth, urls) # 这里可以取出所有dosth返回的结果数组,不知道这么大的数据,这么写会不会有问题 def dosth(url): # do |
3
mdjhny 2013-08-13 16:52:08 +08:00
只需要维护两个队列,做好出错处理就行,这里有一个简陋的
http://mdjhny.github.io/a-producer-and-consumer-multithread-spider.html |
4
sivacohan 2013-08-13 17:04:45 +08:00 via Android
gevent
|
5
yakczh 2013-08-13 17:26:42 +08:00
多线程的话每个线程每抽取一个链接,都是去一个全局的注册器看这个链接是不是已经处理过, 不如按任务开始做好分工, 多进程并发多个抓取队列,这样对资源的争用要少些
|
6
binyuJ 2013-08-13 21:19:01 +08:00
短时间对同一个网站弄这么多请求会不会把网站弄挂掉(-_-)ゞ゛或者自己电脑挂掉
为什么不试试直接用 thread、threading |
7
11 2013-08-13 21:23:10 +08:00
初级的简单的就用 threading 吧。
要是会玩就用 gevent 吧。 |
8
likuku 2013-08-13 23:37:51 +08:00
可以用for遍历数列,每一个元素单独开出个子进程,每开一定数量子进程,暂停1~2秒,然后继续遍历开子进程。
参考 subprocess 模块。 |
9
likuku 2013-08-13 23:41:43 +08:00
开子进程不会受限于GIL(Python的线程用GIL调度,一个程序进程里的所有线程共享这个进程的资源,你有32核CPU,只开一个进程的话,所有线程也只能用到1个核)。
子进程里带入数组元素作为参数传给子进程启动的独立程序,独立程序读取参数,执行抓取任务。结果输出,可以每个自进程都写入某共享数据库,或者独立开个文件记录。 |