当前位置: 首页 > 知识库问答 >
问题:

线程:线程在完成作业之前退出

司马项明
2023-03-14

我试图理解Python线程的“守护进程”标志。这我知道

线程可以标记为“守护线程”。此标志的意义在于,当只剩下守护进程线程时,整个Python程序将退出。初始值从创建线程继承。

但在我的例子中,python程序在守护进程线程离开并且线程没有完成其工作之前退出。

def ThreadDecorator(f):
    def wrap(*args,**kargs):
        t=Thread(target=f,args=args,kwargs=kargs)
        t.daemon=True
        t.start()
return wrap

@ThreadDecorator
def runSomething(*args,**kwargs):
    i = 0
    attente = 0
    fileName=kwargs['file']
    f=open(fileName,'wt')
    while i < 50000:
        f.write(str(i)+"\n")
        # attente += 0.2
        # attente += random.randint(1, 60) / 100
        # time.sleep(attente)
        i += 1
    f.close()
    return "Finished"

主程序

runSomething("5",file='test1.txt')
runSomething("6",file='test2.txt')

第一个线程只写5000个第一个整数,而第二个线程不写任何数字

共有1个答案

卢志业
2023-03-14

我觉得主块应该包含一个。一旦所有线程都完成了,就可以调用pool.close()来确保所有线程都完成了执行

from multiprocessing import Pool
from datetime import datetime

pool = Pool(processes = 2)
num_workers = 2
curr_worker = 1
val = 5
if (curr_worker < num_workers ):
    file_name = 'test'+str(curr_worker)+'.txt'
    pool.apply_async(run_Something,args=(val,file_name,)))
    curr_worker += 1
    val += 1
else:
    pool.close()
    pool.join()
    curr_worker = 1
    val = 5
print ("Workers returned result", datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

主进程在启动守护进程线程后退出。由于守护进程线程在非守护进程主线程终止时停止,因此我们只看到test1。txt有5000条记录。

主要的任务是启动下面的帖子,它将退出:

runSomething("5",file='test1.txt')
runSomething("6",file='test2.txt')
 类似资料:
  • 问题内容: 主线程将在子线程完成执行之前退出? 我读了两篇文章 http://www.cs.mtu.edu/~shene/NSF-3/e-Book/FUNDAMENTALS/thread- management.html 在以上文章的“线程终止”段中,它用红色表示“如果父线程终止,则其所有子线程也终止。” http://www.roseindia.net/java/thread/overview-

  • 这是我正在研究的完全未来的例子 首先我从SupplySync调用compose方法,在这里我执行方法composeMethod,有三毫秒的延迟,然后它将创建一个文件并返回一个字符串作为结果。完成后,我调用Run方法,它只打印一个方法,然后有一个非阻塞方法从主线程运行。 我在这里面临的问题是,主线程执行完nonblockingmethod()并在3毫秒延迟之前退出进程,而随后的composeMeth

  • 问题内容: 我正在将一个大文件切成块,并想显示进度。当我单击startCut Button时,这是要执行的代码: 我在位置B的运行方法外部更改了进度栏的值,问题是grogressbar仅显示两种状态:0%和100%。但是,如果我删除了位置B的代码,并在位置A的run方法内更改了progressbar的值,问题将消失。我知道也许可以很容易地修复它,但是我确实想知道为什么会发生这种情况,尽管我更改了r

  • 我想从android客户端上传图像文件到服务器(服务器制作缩略图,并返回缩略图的url)。 然而,我塞进了这个错误消息。 我试着在stackoverflow中找到这个错误代码,但是我找不到Android的答案。 这是客户端代码(imgURL看起来像/storage/emulated/0/dcim/img/1493742568136.jpg)

  • 我正在尝试使用队列实现多线程生产者-消费者模式。Python 2.7中的队列。我试图找出如何让消费者,即工作线程,在完成所有必需的工作后停止。 参见马丁·詹姆斯对这个答案的第二条评论:https://stackoverflow.com/a/19369877/1175080 发送“我已完成”任务,指示池线程终止。任何获得此类任务的线程都会重新请求它,然后自杀。 但这对我不起作用。例如,请参见以下代码

  • 将库升级到和(查找FTP库中可能的bug)我设法持续了3周 我有一个要监视,该作业表示触发器状态为。应用程序服务器不重用阻塞进程的 我没有找到关于Quartz这类问题的文档,因此我怀疑是FTP库中的bug干扰了Quartz启动的线程,例如的使用