在python中的多线程程序中,只有一个子线程工作,即使我使用join()程序也没有正常退出

在python中的多线程程序中,只有一个子线程工作,即使我使用join()程序也没有正常退出,python,multithreading,Python,Multithreading,我创建了十个线程来处理全局列表中的项 但我不知道为什么只有第一个工人做这项工作 而且,主线程在子线程完成之前完成,即使我使用了thread.join()。 下面是代码,我认为问题可能是因为我在myThread.run中使用了while循环。但我不知道如何告诉这些线程在全局列表为空之前继续工作 # coding=utf-8 import threading import numpy as np dfs = ['units' + str(i).zfill(5) for i in range(250

我创建了十个线程来处理全局列表中的项 但我不知道为什么只有第一个工人做这项工作 而且,主线程在子线程完成之前完成,即使我使用了thread.join()。 下面是代码,我认为问题可能是因为我在myThread.run中使用了while循环。但我不知道如何告诉这些线程在全局列表为空之前继续工作

# coding=utf-8
import threading
import numpy as np

dfs = ['units' + str(i).zfill(5) for i in range(250)]
units = dfs.copy()
k = [str(i).zfill(5) for i in range(500, 21800000)]
units.extend(k)
np.random.shuffle(units)
marker = []


def working_fun(df, unit):
    global marker
    if unit in df:
        threadlock.acquire()
        marker.append(int(unit[5:]))


class myThread(threading.Thread):
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
        self.work_load = []

    def run(self):
        global dfs
        print("start thread" + self.name)

        while True:
            threadlock.acquire()
            if units != []:
                unit = units.pop()
            else:
                unit = None
            threadlock.release()

            if unit is not None:
                self.work_load.append(unit)
                working_fun(dfs, unit)
            else:
                print('------', self.name, '--finish---', len(self.work_load), '--------')
                break


threadlock = threading.RLock()

thds = []
for i in range(10):
    thd = myThread(name='thd' + str(i))
    thds.append(thd)
for thd in thds:
    thd.start()
    thd.join()

print('output:', marker)
试着这样做:

导入numpy
导入多处理
#和以前一样
dfs=['units'+str(i).zfill(5)表示范围(250)内的i)
单位=dfs.copy()
k=[str(i).zfill(5)表示范围(50021800000)内的i]
单位。扩展(k)
numpy。随机。洗牌(单位)
#几乎和以前一样
def工作乐趣(inp):
df,单位=inp
如果单位为df:
返回整数(单位[5:])
#这是多处理/线程化所必需的
如果名称=“\uuuuu main\uuuuuuuu”:
#创建工作人员池(本例中为10人)
使用多处理。池(10)作为池:
#将一些(全局)iterable映射到Worker池中
结果=pool.map(工作乐趣,[(dfs,unit)表示单位为单位])
#显示结果(请注意,如果单元不在df中,则函数返回None)
打印([r为r,如果r不是无])
输出:

$python test.py
[1, 75, 139, 24, 101, 72, 156, 55, 58, 235, 14, 123, 177, 112, 168, 178, 173, 162, 104, 226, 230, 205, 69, 100, 246, 18, 117, 149, 37, 214, 206, 26, 136, 87, 144, 79, 50, 222, 7, 133, 36, 41, 30, 163, 103, 187, 6, 225, 15, 223, 234, 138, 126, 19, 64, 224, 39, 145, 130, 42, 11, 221, 128, 213, 204, 2, 45, 220, 242, 109, 59, 238, 232, 68, 152, 107, 148, 83, 197, 241, 118, 32, 90, 99, 22, 119, 0, 67, 48, 181, 71, 193, 95, 29, 113, 40, 134, 218, 141, 27, 121, 8, 207, 110, 60, 237, 47, 94, 73, 157, 184, 78, 159, 49, 202, 239, 124, 215, 127, 209, 62, 4, 52, 82, 74, 9, 199, 158, 188, 3, 61, 180, 57, 219, 245, 38, 16, 190, 12, 17, 175, 46, 196, 125, 194, 76, 129, 161, 81, 93, 137, 155, 174, 54, 35, 25, 115, 140, 216, 23, 21, 233, 77, 33, 92, 208, 120, 86, 165, 70, 135, 28, 91, 66, 85, 169, 203, 211, 114, 154, 122, 217, 247, 31, 147, 96, 142, 191, 10, 183, 80, 179, 189, 56, 105, 160, 228, 185, 132, 5, 53, 106, 13, 210, 182, 89, 192, 153, 170, 111, 65, 212, 186, 151, 200, 248, 229, 102, 240, 198, 176, 43, 131, 166, 236, 231, 116, 172, 146, 88, 44, 98, 227, 20, 34, 164, 108, 171, 244, 243, 195, 150, 249, 97, 167, 51, 201, 84, 63, 143]

zip(dfs,单位)将(一个df,单位)放入工作函数,但这里的工作函数是一个简化的函数,在实际工作中,我需要将(所有dfs,单位)放入工作函数。那么,我如何以这种方式传输这些参数呢?我也不知道为什么,这些代码在我的电脑里似乎不正常,输出是空的。好吧,我不知道。我已经更新了我的答案,并在我的机器上添加了输出。