我编写了一个简单的脚本,使用线程从服务中检索数据。在
__author__ = 'Igor'
import requests
import time
from multiprocessing.dummy import Pool as ThreadPool
ip_list = []
good_ip_list = []
bad_ip_list = []
progress = 0
with open('/tmp/ip.txt') as f:
ip_list = f.read().split()
def process_request(ip):
global progress
progress += 1
if progress % 10000 == 0:
print 'Processed ip:', progress, '...'
r = requests.get('http://*****/?ip='+ip, timeout=None)
if r.status_code == 200:
good_ip_list.append(ip)
elif r.status_code == 400:
bad_ip_list.append(ip)
else:
print 'Unknown http code received, aborting'
exit(1)
pool = ThreadPool(16)
try:
pool.map(process_request, ip_list)
except:
for name, ip_list in (('/tmp/out_good.txt', good_ip_list), ('/tmp/out_bad.txt', bad_ip_list)):
with open(name, 'w') as f:
for ip in ip_list:
print>>f, ip
但在处理了一些请求(40-50万)后,我收到:
线程7中出现异常(很可能在解释器关闭期间引发): 回溯(最近一次呼叫): 进程结束,退出代码为0
尝试更改服务设置:
^{pr2}$但还是同样的错误。谁能帮我-怎么了?在
这个:
与Python多处理混合使用是不安全的。正确的方法是从对
process_request
的每次调用中返回一个元组(或其他东西),然后在最后将它们连接起来。从多个进程同时修改progress
也是不安全的。我不确定您的错误是什么,但我敢打赌,是某些同步问题导致了Python的整体死亡。在请删除共享状态,然后重试。在
感谢所有帮助我解决这个问题的人。重写整个代码,现在它可以完美地工作了:
一些新的有用信息:
1)在函数
process_request
中的不同线程中写入数据是非常糟糕的主意,现在它返回语句(true\false)和ip。在2)默认情况下,
^{pr2}$keep alive
完全受requests
的支持,但如果要使用它,则必须创建对象Session
的实例,并仅对其应用get
方法:相关问题 更多 >
编程相关推荐