Python 获取异常错误“;线程thread-13中的异常(很可能在解释器关闭时引发)和#x201D;

Python 获取异常错误“;线程thread-13中的异常(很可能在解释器关闭时引发)和#x201D;,python,multithreading,exception,Python,Multithreading,Exception,我编写了一个简单的脚本,它使用线程从服务中检索数据 __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().sp

我编写了一个简单的脚本,它使用线程从服务中检索数据

    __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
但在处理了一些请求(40k-50k)后,我收到:

线程thread-7中出现异常(很可能在解释器关闭期间引发): 回溯(最近一次呼叫最后一次): 进程已完成,退出代码为0

试图更改服务设置:

        <timeout>999</timeout>
        <connectionlimit>600</connectionlimit>
        <httpthreads>32</httpthreads>
        <workerthreads>128</workerthreads>
999
600
32
128
但还是同样的错误。有人能帮我吗?怎么了?

这个:

good_ip_list = []
bad_ip_list = []
与Python多处理混合使用是不安全的。正确的方法是从每次调用
process\u request
返回一个元组(或其他),然后在最后将它们连接起来。同时从多个进程修改
进度
也是不安全的。我不确定您的错误是什么,但我敢打赌,正是一些同步问题导致了Python整体的死亡


请删除共享状态并重试。

感谢所有帮助我解决此问题的人。重写整个代码,现在它可以完美地工作:

__author__ = 'kulakov'
import requests
import time
from multiprocessing.dummy import Pool as ThreadPool

ip_list = []
good_ip_list = []
bad_ip_list = []

with open('/tmp/ip.txt') as f:
    ip_list = f.read().split()

s = requests.Session()
def process_request(ip):
    r = s.get('http://*****/?ip='+ip, timeout=None)
    if r.status_code == 200:
        # good_ip_list.append(ip)
        return (ip, True)
    elif r.status_code == 400:
        # bad_ip_list.append(ip)
        return (ip, False)
    else:
        print 'Unknown http code received, aborting'
        exit(1)

pool = ThreadPool(16)
for ip, isOk in pool.imap(process_request, ip_list):
    if isOk:
        good_ip_list.append(ip)
    else:
        bad_ip_list.append(ip)
pool.close()
pool.join()

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
一些新的有用信息:

1) 在函数
process\u request
中的不同线程中写入数据是一个非常糟糕的主意,现在它返回语句(true\false)和ip

2) 默认情况下,
请求
完全支持保持活动状态,但如果要使用它,必须创建对象的实例
会话
,并仅对其应用
获取
方法:

s = requests.Session()
r = s.get('http://*****/?ip='+ip, timeout=None)

`打印>>f,ip`这是打字错误吗?回溯中还有其他内容吗?
progress+=1
语言中使用可变数据并使用多个线程,没有任何保护。。。我不再看那一点;)@据我所知,PatrickCollins-requests.exceptions.ConnectionError中的问题出现了,试图捕获它并继续pool.map,但同样的效果是您的代码错误。与good/bad_ip_list.append(从多个线程访问的共享列表,无任何保护)相同。您首先需要学习如何使用python制作多线程应用程序。我敢打赌,这就是您所遇到的错误的原因,但我不打算从一开始就深入研究它,因为它很糟糕。简单的解释-当两个线程试图在同一时间附加到同一个列表时,糟糕的事情就会发生。我不知道他们为什么鼓吹使用可变数据的语言对初学者来说是好的……谢谢,@Patrick Collins我想你的建议是对的:“我打赌是一些同步问题导致了整个Python的死亡”你能再解释一下吗,请注意这一点:“删除共享状态,再试一次。”作为输入数据,我有一个函数“process_request”和一个列表“ip_list”。那么,映射这两个对象的正确方法是什么呢?不是在循环中(就像我在循环中尝试的那样,它工作得很好,但是非常慢),而是在不同的线程中。谢谢。@Igor取出
好ip\u列表、坏ip\u列表
进度
处理请求
的参考。不要修改
process\u request
中的任何内容,除非您在
process\u request
中创建了对象。相反,根据IP是否良好,在通话中返回
true
false