Python - 如何运行数组批处理

时间:2017-06-28 18:08:28

标签: python arrays multithreading

我是Python的新手,我目前正在研究多个网页抓取工具。当我在玩Python时,我发现了线程,这确实加快了代码的速度。问题是脚本会占用大量网站,我喜欢在使用线程时使用'批处理'数组。

当我有一个1000件物品的数组时,我想要抓住10件物品。当脚本完成这10个项目后,抓住10个新项目直到没有任何内容

我希望有人可以帮助我。提前谢谢!

import subprocess
import threading
from multiprocessing import Pool

def scrape(url):
    return subprocess.call("casperjs test.js --url=" + url, shell=True)

if __name__ == '__main__':
    pool = Pool()
    sites = ["http://site1.com", "http://site2.com", "http://site3.com", "http://site4.com"]

    results = pool.imap(scrape, sites)

    for result in results:
        print(result)

将来我使用sqlite数据库存储所有URL(这将替换数组)。当我运行脚本时,我希望控制停止进程并在需要时继续。这不是我的问题,而是我的问题的背景。

2 个答案:

答案 0 :(得分:0)

  

问题:... 1000件物品的数组我想要抓住10件物品

for p in range(0, 1000, 10):
    process10(sites[p:p+10])

答案 1 :(得分:0)

如何使用Process中的Queuemultiprocessing?编写一个worker函数并从循环中调用它使它作为批处理运行。使用Process,可以在需要时启动和停止作业,并让您更好地控制它们。

import subprocess
from multiprocessing import Process, Queue


def worker(url_queue, result_queue):
    for url in iter(url_queue.get, 'DONE'):
        scrape_result = scrape(url)
        result_queue.put(scrape_result)


def scrape(url):
    return subprocess.call("casperjs test.js --url=" + url, shell=True)


if __name__ == '__main__':
    sites = ['http://site1.com', "http://site2.com", "http://site3.com", "http://site4.com", "http://site5.com",
             "http://site6.com", "http://site7.com", "http://site8.com", "http://site9.com", "http://site10.com",
             "http://site11.com", "http://site12.com", "http://site13.com", "http://site14.com", "http://site15.com",
             "http://site16.com", "http://site17.com", "http://site18.com", "http://site19.com", "http://site20.com"]
    url_queue = Queue()
    result_queue = Queue()
    processes = []

    for url in sites:
        url_queue.put(url)

    for i in range(10):
        p = Process(target=worker, args=(url_queue, result_queue))
        p.start()
        processes.append(p)
        url_queue.put('DONE')

    for p in processes:
        p.join()

    result_queue.put('DONE')

    for response in iter(result_queue.get, 'DONE'):
        print response

请注意Queue是支持推送和拉动元素的FIFO队列。