多线程应用程序的行为不清楚:无法退出线程
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
【讨论】:
以上是关于多线程应用程序的行为不清楚:无法退出线程的主要内容,如果未能解决你的问题,请参考以下文章