多线程start_new_thread从全局列表中删除项目

时间:2014-08-14 09:09:17

标签: python multithreading

我正在尝试学习如何将项目拆分为几个cpu以使其更快, 这就是我想要实现的目标:

我有一份清单。 将该列表拆分为较小的块。 每个块都是一个线程,进程等... 对于块中的每个项目,将其从初始列表中删除。 最后,主列表应为空

基本上将此列表分成几个人,每个人都会删除它的项目。

我仍然需要处理分割块的功能,因为它没有正确容纳主列表的最后一项。

这是我的第一次测试:

from thread import start_new_thread
global lista
lista = range(10, 25)

def print_list(a_list):
    for i in a_list:
        lista.remove(i)
    return

def chunks(lista, num_parts, return_tuples=True):
    """
    split a lista into sections.
    :param lista: list that will be splited
    :param num_parts: amount of sections
    :return: a list of tuples
    """
    n = len(lista)/num_parts
    list_of_tuples = zip(*[iter(lista)]*n)

    if return_tuples is False:
        list_of_list=[]
        for i in list_of_tuples:
            list_of_list.append(list(i))
        return list_of_list
    return list_of_tuples

splited_list = chunks(lista, 4, return_tuples=False)
print splited_list

start_new_thread(print_list, (splited_list[0],))

这就是我得到的:

[[10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21], [22, 23, 24]]
Unhandled exception in thread started by 
sys.excepthook is missing
lost sys.stderr

我的第二个测试是使用线程:

from threading import Thread   
global lista
lista = range(10, 25)

def print_list(a_list):
    for index, i in enumerate(a_list):
        lista.remove(i)

def chunks(lista, num_parts, return_tuples=True):
    """
    split a lista into sections.
    :param lista: list that will be splited
    :param num_parts: amount of sections
    :return: a list of tuples
    """
    n = len(lista)/num_parts
    list_of_tuples = zip(*[iter(lista)]*n)

    if return_tuples is False:
        list_of_list=[]
        for i in list_of_tuples:
            list_of_list.append(list(i))
        return list_of_list
    return list_of_tuples

splited_list = chunks(lista, 4, return_tuples=False)
print splited_list

t = Thread(target=print_list, args=(splited_list[0],))
t.start()

# t = Thread(target=print_list,args=(splited_list[1],))
# t.start()

print "\n------"
print lista
print splited_list

在这个中,并没有给我任何错误,但列表仍然完成。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

您不应该使用thread - 模块,它是一个内部模块(因此在Python 3中重命名为_thread)。在第一个示例中,主程序在线程之前终止,并且某些资源不再可用。始终使用threading