需求
因为我们本地数据库中经常会产生大量的数据,这些数据需要同步至jira.覆盖掉jira上的老数据。
因为jira服务器部署在国外,连接巨慢。每次修改一个,至少需要花费10秒左右的时间。
而jira-api没有提供批量或者异步同步的方法,所以需要自己使用一个异步的方式来实现一次性把所有的请求发送出去。
jira服务端有时候吃不消,会关闭掉我的一些连接,所以还需要在被关闭之后,记录下这些同步至jira失败的,重新继续修改操作
用到的库
gevent 库
gevent是一个基于libev的并发库。它为各种并发和网络相关的任务提供了整洁的API。
jira库。
里面有jira登录,修改,新增issue的方法
代码实现
# -*- coding: UTF-8 -*-
import datetime
import random
import gevent
from gevent import monkey
from jira import JIRA
from model import addDefectDAO
monkey.patch_all()
issue_list = []
def update(issue_key):
# 产生一点小小的间隔,避免一瞬间发出去100多个请求
gevent.sleep(random.randint(1, 5) * 0.001)
global issue_list
starttime = datetime.datetime.now()
print(starttime)
print("start:" + issue_key)
print("start:" + issue_key)
issue = jira.issue(issue_key)
issue_dict = {
'summary': issue_key
}
try:
issue.update(fields=issue_dict)
issue_list.remove(issue_key)
except Exception:
pass
print("end:" + issue_key)
# 从一个本地数据库取出一堆issue的信息,602是本地的project信息编号
all = addDefectDAO.defect_select_not_draft_by_project_id(602)
for item in all:
issue_list.append(item["issue_key"])
url = "https://www.jira.com"
username = "username"
password = "password"
jira = JIRA(server=url, basic_auth=(username, password), max_retries=0, timeout=400, async_=True, async_workers=5)
# jira2 = Jira(url=url, username=username, password=password)
print("登录成功")
starttime = datetime.datetime.now()
api_list = []
while issue_list != []:
for i in issue_list:
api_list.append(gevent.spawn(update, i))
gevent.joinall(api_list)
endtime = datetime.datetime.now()
print('总耗时')
print((endtime - starttime).seconds)
print('*******')
注意事项
1.需要引用monkey.patch_all()
2.引用monkey.patch_all()之后会有错误信息:
UserWarning: libuv only supports millisecond timer resolution; all times less will be set to 1 ms
这个是已知bug,在11月29日有人在github上已经提过了,作者会在之后的版本修改。目前不影响使用。请忽略
3.通过这样的方法修改之后,经过我的测试,速度大概快了5倍以上