运行多线程脚本,在取消python后继续运行

时间:2016-02-21 17:45:53

标签: python multithreading

这是一个两部分的问题,

  1. 取消我的脚本后,它仍然继续运行,我正在做的是为交换api排队并保存各种资产的数据。
  2. My parent script can be seen here你可以看到我只用3个资产测试它,one of the child scripts can be seen here的样本。

    取消脚本后,BTC的脚本似乎仍在运行,新的.json文件仍在其各自的文件夹中生成。阻止它的唯一方法是删除文件夹并再次创建它。

    1. 这真是一个奖励,我的代码正在使用两个资产,但现在添加另一个,它似乎只接收BTC的数据,而不是其他2。

1 个答案:

答案 0 :(得分:0)

你的第一个问题是你并没有真正创建工作线程。 t1 = Thread(target=BTC.main())执行BTC.main()并使用其返回代码尝试启动一个线程。由于主循环永远,你不会启动任何其他线程。

一旦你解决了这个问题,你仍然会遇到问题。

在python中,只有根线程看到ctrl-c等信号。无论你怎么努力按键,其他线程都会继续执行。当python退出时,它会尝试加入非守护程序线程,这会导致程序挂起。主线程正在等待一个线程终止,但线程很高兴继续执行它。

您似乎在代码中依赖于此。你的父母启动了一堆线程(或者,当你修复第一个bug时),然后退出。真的,它等待线程退出。如果使用守护程序线程解决问题(如下所示),则还需要为线程添加等待而不退出的代码。

回到线程问题......

一种解决方案是将线程标记为“守护进程”(在启动线程之前执行mythread.daemon = True)。 Python不会等待那些线程,并且当主线程退出时线程将被终止。如果您不关心线程在终止时处于什么状态,那么这很好。但它可以做坏事,比如留下部分书面文件。

另一种解决方案是找出主线程中断线程的某种方式。假设线程等待套接字流量。您可以关闭套接字,该事件将唤醒线程。

另一种解决方案是仅为要完成的短期任务运行线程。你的ctrl-c有点延迟,但你最终会退出。您甚至可以将它们设置为从队列中运行并在完成后向它们发送特殊的“kill”消息。事实上,python线程池是一个很好的方法。

另一个解决方案是让线程检查一个事件以查看是否有时间退出。