Python-如何运行数组批处理

Python-如何运行数组批处理,python,arrays,multithreading,Python,Arrays,Multithreading,我是Python新手,目前正在开发一个多网页刮板。当我在玩Python时,我发现了线程,这确实加快了代码的速度。问题是,脚本会刮取很多站点,我喜欢在使用线程时将其放入“批处理”数组中 当我有1000件物品时,我想抓取10件物品。脚本处理完这10个项目后,抓取10个新项目,直到什么都没有剩下 我希望有人能帮助我。提前谢谢 import subprocess import threading from multiprocessing import Pool def scrape(url):

我是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(这将替换数组)。当我运行脚本时,我希望控制停止进程,并在需要时继续。这不是我的问题,而是我问题的背景

问题:。。。1000件物品的阵列我想抓取10件物品


使用
多处理
中的
过程
队列
如何?编写辅助函数并从循环中调用它可以使其作为批处理运行。使用
流程
,可以在需要时启动和停止作业,并使您能够更好地控制它们

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队列。

您所说的“数组”是什么意思?@Jan显示您当前正在执行的操作(代码)会很有帮助。对不起。我已经添加了我目前拥有的代码。如果您将池设置为特定的大小,如
pool=pool(10)
,那么您可以将所有
1000
URL馈送到池中,它将打包工作,以便在处理完所有线程之前,不会有超过
10
个线程同时运行。注意,您使用的是列表而不是数组。
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