多线程应用程序的行为不清楚:无法退出线程

Posted

技术标签:

【中文标题】多线程应用程序的行为不清楚:无法退出线程【英文标题】:Unclear behavior of multithreading application: can't exit thread 【发布时间】:2015-08-16 16:01:46 【问题描述】:

python 2.7 上的多线程应用程序。 我使用“线程”和“线程”库。

主线程已经启动了其他 10 个线程,它们做了一些工作。他们有一个共享数据类(单音)。我不使用任何线程阻塞,它看起来不错。 主线程使用线程类的“start”和“join”方法启动此线程。 十个线程之一,每 10 秒启动一次并进行一些数学计算。 工作完成后,线程调用“thread.exit()”。

而且有时主线程没有一个线程的结果。 话题结束了!并且所有的代码字符串都是完整的,但是主线程在“join”指令上停止并且没有响应。

附言我不是以英语为母语的人,描述这个问题非常困难。请宽容。

代码示例:

while True: 

all_result = check_is_all_results()
time.sleep(1)

if (all_result):
    print app_data.task_table
    app_data.flag_of_close = True
    time.sleep(2)  # Задержка на всякий случай

if (app_data.flag_of_close):
    terminate()
print u"TEST"

if len(app_data.ip_table[app_data.cfg.MY_IP]['tasks']):  
    if (app_data.cfg.MULTITHREADING or app_data.complete_task.is_set()):  
        job = Worker(app_data, SRV.taskResultSendToSlaves, app_data.ip_table[app_data.cfg.MY_IP]['tasks'].pop())
        job.setDaemon(True)
        job.start()


###########################################################
class Worker(threading.Thread):

def __init__(self, data, sender, taskname):
    self.data = data
    self.sender = sender
    self.taskname = taskname
    threading.Thread.__init__(self)

def run(self):
    import thread
    self.data.complete_task.clear()
    tick_before = time.time()
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    startupinfo.wShowWindow = subprocess.SW_HIDE
    p = subprocess.Popen(self.data.cfg.PATH_INTERPRETER + " " + self.data.cfg.PATH_TASKS + self.taskname, startupinfo=startupinfo, shell=False, stdout=subprocess.PIPE)
    job_result, err = p.communicate()
    tick_after = time.time()
    work_time = tick_after - tick_before
    self.data.task_table[self.taskname]['status'] = 'complete'
    self.data.task_table[self.taskname]['result'] = job_result
    self.data.task_table[self.taskname]['time'] = work_time
    tr = threading.Thread(target=self.sender, name="SENDER", args=(self.taskname, ))
    tr.setDaemon(True)
    tr.start()
    tr.join()
    self.data.complete_task.set()
    thread.exit()

有时调用 Worker 的主无限循环不打印“TEST”,也不响应。

【问题讨论】:

不确定你是如何从线程返回数据的,但你可以尝试这样的事情:***.com/a/6894023/276949 请发布一些显示问题的示例代码。 @PatrickMaupin,我添加了有问题的代码示例。 【参考方案1】:

您的工作线程正在生成子进程。不幸的是,这永远不会正常工作,因为这是首先使用仅从父进程复制正在执行的线程的 fork 完成的。抱歉,在您重组之前,您的程序将不可靠。以下是一些背景信息以及更多信息的链接:

https://***.com/a/32107436/3577601

Status of mixing multiprocessing and threading in Python

https://***.com/a/6079669/3577601

【讨论】:

以上是关于多线程应用程序的行为不清楚:无法退出线程的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用多线程,在关闭窗体时 怎么关闭窗体的所有线程,使程序退出

关于多线程

Python多线程

java应用程序在linux上运行无法自动退出

CORBA 不清楚的东西

单元测试多线程 程序不正常执行解决方案