#coding=utf-8
import sys,time,urllib,json,datetime
import urllib2
import threading
from Queue import Queue
from random import randint
class thread_init(threading.Thread):
def __init__(self, que):
threading.Thread.__init__(self)
self.que = que
def run(self): # 使用队列实现进程通信
while True:
num = self.que.get(block=True)
key = num[0]
clid = num[1]
dataType = num[2]
date = num[3]
thrnum = num[4]
if str(key) == '12345678':
pass
else:
if int(self.que.qsize()) <= (int(thrnum) * 1.5):
metux.acquire()
getZhdgclzczs(key,clid,dataType,date)
metux.release()
else:
getZhdgclzczs(key, clid, dataType, date)
curCount = self.que.maxsize - self.que.unfinished_tasks
# curCount = self.que.maxsize - self.que.qsize()
allCount = self.que.maxsize
percent = str((1 - float(self.que.unfinished_tasks) / float(self.que.maxsize))*100)+'%'
result = '%s,%s进度:%s/%s,%s' % (str(key), str(clid), curCount, allCount, percent)
print result
if self.que.empty():
self.que.task_done()
break
self.que.task_done()
def getZhdgclzczs(key,clid,dataType,date):
key = key
clid = clid
dataType = dataType
date = date
# time.sleep(0.1)
def Main(groupNum, dataType, date):
global metux
metux = threading.RLock()
groupNum = int(groupNum)
print '开始'
user_list_bef = [(randint(1, 10000), randint(1, 10000)) for i in range(1000)]
user_list_new = [(tmp_user[0],tmp_user[1],dataType,date,groupNum) for tmp_user in user_list_bef]
user_list_new.sort(key=lambda x: x[0])
allCount = len(user_list_new)
threads = []
queue = Queue() # 建立消息队列
queue.maxsize = allCount
for i in range(len(user_list_new)):
queue.put(user_list_new[i])
for j in range(groupNum):
thread = thread_init(queue)
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
print '100%'
d1 = datetime.datetime.now()
Main('20', '3', '20170126')
d2 = datetime.datetime.now()
print d2 - d1
# 如果不注释time.sleep(0.1)就不出现僵死情况,如果注释掉,每次都会僵死,在我的代码中,十次会出现1-2次僵死情况