celery 任务代码大致如下,此任务未加 soft_time_limit 或 time_limit 其中 Session 是根据以下四行代码得来:
SQLALCHEMY_DATABASE_URI = 'mysql://xx'
some_engine = create_engine(SQLALCHEMY_DATABASE_URI, echo=False, pool_pre_ping=True)
session_factory = sessionmaker(autocommit=False, bind=some_engine) # autoflush=False,
Session = scoped_session(session_factory)
celery 任务大致代码:
'''
class NmapThread_(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
try:
ip = self.queue.get(block=False)
except SoftTimeLimitExceeded as e:
raise
except Exception as e:
logging.error(e, exc_info=True) # 记录线程退出
break
try:
ns = nmap.scan(ip) # 使用 subprocess.Popen()调用外部 nmap 扫描该 ip 并将结果入库
ns.run()
except SoftTimeLimitExceeded as e:
raise
except Exception as e:
logging.error(e, exc_info=True)
finally:
Session.remove()
self.queue.task_done()
class IpScan:
def __init__(self):
self.queue = Queue()
self.thread_count = 2
def run(self):
# 此处入队列的 IP 个数非常多,大概需要多线程运行 1 周
self.queue.put('1.1.1.1')
self.queue.put('2.2.2.2')
self.queue.put('3.3.3.3')
self.queue.put('4.4.4.4')
self.queue.put('5.5.5.5')
self.queue.put('6.6.6.6')
self.scan_start()
def scan_start(self):
for i in range(self.thread_count):
t = NmapThread_(self.queue)
t.setDaemon(True)
t.start()
self.queue.join()
def web_fingerprint_discern(*args, **kwargs):
print('web_fingerprint_discern begin!')
print(args)
print(kwargs)
@ce.task(name='default.test4queue', bind=True)
def test4queue(self):
ips = IpScan()
ips.run()
web_fingerprint_discern()
'''
现在的问题是多线程运行期间一直没有问题,直到最后多线程执行完(2019-08-31),抛出异常 break 跳出各线程之后,celry worker 就卡住假死了(2019-08-31),具体表现在:
然后我今天(2019-09-02)上班的时候强制 ctrl+c 之后,输出了一些日志,
大家可以看到, web_fingerprint_discern()的 3 条 print 语句,第 1 条发生 2019-08-31,后 2 条发生在 2019-09-02 我 ctrl+c 的时候,其他附加表现:
一直不能解决这个 celery 问题,由于时间原因也不方便换其他类 celery 架构,而且调试发现如果不是扫描任务就不会假死(当然测试时间肯定没有一周那么长,只有几分钟,所以如果完整模拟测试非常耗时,想寻找可能出现的问题点修复后再行测试)
求各位大佬帮忙解决,若能解决,50 红包奉上以表谢意。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.