在Python中为活动线程提供唯一的编号

时间:2017-02-02 16:01:38

标签: python multithreading

我多线程化一个API,我想给每个线程一个唯一的ID,以便我可以在程序完成后根据索引处理响应。

以下是我目前正在使用的代码。问题是.getName()不是唯一的。当线程被杀死时,标识符可以被回收。

对此有何解决方案?

def get_Data(q):
send = q.get()
while True:
    api = op.API()
    api_response['Thread_id'].append(threading.currentThread().getName())
    response_api = api.Get(send, "json")
    api_response['query_response'].append(response_api)
    q.task_done()

def threading_0SM(request):
    q = Queue(maxsize=0)
    if len(chunk_request)<=16:
         num_threads = len(request)
    else: num_threads = 16
    for i in range(num_threads):
        worker = Thread(target=get_Data, args=(q,))
        worker.setDaemon(True)
        worker.start()
    for place in request:
        q.put(place)
    q.join()

2 个答案:

答案 0 :(得分:1)

您可以在创建线程时设置线程名称。我喜欢使用itertools.count来创建程序唯一的数字,因为它是线程安全的。在这里,我用它来制作独特的线程名称。您可以更改格式以满足您的需求。

import itertools

# returns unique number on each next(unique_id)
unique_id = itertools.count()

def unique_thread_id():
    return "mythread-" + str(next(unique_id))

def get_Data(q):
    send = q.get()
    while True:
        api = op.API()
        api_response['Thread_id'].append(threading.currentThread().getName())
        response_api = api.Get(send, "json")
        api_response['query_response'].append(response_api)
    q.task_done()

def threading_0SM(request):
    q = Queue(maxsize=0)
    if len(chunk_request)<=16:
         num_threads = len(request)
    else: 
        num_threads = 16
    for i in range(num_threads):
        worker = Thread(target=get_Data, name=unique_thread_id(), args=(q,))
        worker.setDaemon(True)
        worker.start()
    for place in request:
        q.put(place)
    q.join()

答案 1 :(得分:0)