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