Python threading.thread.start()不会将控制权返回给主线程

马修

我正在尝试以某种方式执行一段代码的程序,以便用户可以随时停止其执行而无需停止主程序。我以为可以使用threading.Thread做到这一点,但是后来我在IDLE(Python 3.3)中运行了以下代码:

from threading import *
import math
def f():
    eval("math.factorial(1000000000)")
t = Thread(target = f)
t.start()

最后一行不返回:我最终重新启动了Shell。这是全局解释器锁定的结果,还是我做错了什么?我在线程文档(http://docs.python.org/3/library/threading.html)中没有看到针对此问题的任何特定内容。

我试图用一个过程做同样的事情:

from multiprocessing import *
import math
def f():
    eval("math.factorial(1000000000)")

p = Process(target = f)
p.start()
p.is_alive()

最后一行返回False,即使我在开始该过程后仅几秒钟就运行了它!根据我的处理器使用情况,我不得不得出结论,该过程从一开始就没有开始。有人可以在这里解释我做错了什么吗?

f

Thread.start()永不返回!这与数学库的C实现有关吗?

正如@eryksun在评论中指出的那样:math.factorial()被实现为不释放GIL的C函数,因此直到返回其他Python代码都无法运行。

注意:multiprocessing版本应按原样工作:每个Python进程都有自己的GIL。


factorial(1000000000)有数亿个数字。尝试import time; time.sleep(10)作为虚拟计算。

如果您对IDLE中的多线程代码有疑问,请从命令行尝试相同的代码,以确保错误仍然存​​在。

如果p.is_alive()返回Falsep.start()已经叫,那么它可能意味着有一个错误f()的功能,例如,MemoryError

在我的机器上,如果我将问题中的代码粘贴到Python Shell中,则p.is_alive()返回Truecpus之一为100%。

不相关:删除通配符导入,例如from multiprocessing import *它们可能会在代码中掩盖其他名称,以使您无法确定给定名称的含义,例如,threading是否eval可以使用相似但不同的语义定义函数(它不能,但是可以)可能会无声地破坏您的代码。

我希望我的程序能够优雅地处理来自用户的荒谬输入

如果直接将用户输入传递给用户,eval()则用户可以执行任何操作

有没有办法在不构造管道或其他类似结构的情况下获得打印过程(例如,错误消息)的方法?

这是一个普通的Python代码:

print(message) # works

区别在于,如果运行多个进程,print()则输出可能会出现乱码。您可以使用锁来同步print()呼叫。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

停止python中的threading.Thread

来自分类Dev

停止python中的threading.Thread

来自分类Dev

Python 多功能多线程与threading.Thread?(可变线程数)

来自分类Dev

异步功能不会将控制权返回给主线程(linq表达式)

来自分类Dev

python-是否在threading.Thread类上返回释放所有内存?

来自分类Dev

threading.Thread.start()方法的执行时间取决于Thread目标方法

来自分类Dev

使用threading.Thread.join()

来自分类Dev

为什么threading.Thread通过阻止python 2.5中的执行来同步运行?

来自分类Dev

ExecuteAsync不会将控制权返回给调试器

来自分类Dev

覆盖threading.Thread对象中的start()函数有什么问题?

来自分类Dev

调用某个线程的start()方法后,主线程是否立即获得控制权?

来自分类Dev

Python显然继续无法将控制权返回到while循环

来自分类Dev

异步方法不会将控制权返回给调用者

来自分类Dev

ssh脚本不会将控制权返回给父脚本

来自分类Dev

异步方法不会将控制权返回给调用者

来自分类Dev

从命令行打开Nautilus会产生错误,不会将控制权返回给终端

来自分类Dev

python and ipython threading.activeCount()

来自分类Dev

System.Threading.Thread.Sleep(1000)与System.Threading.Tasks.Task.Delay(1000).Wait()

来自分类Dev

为什么使用System.Threading.Thread.Sleep()是不好的做法?

来自分类Dev

设置System.Threading.Thread.CurrentThread.CurrentCulture的位置

来自分类Dev

为什么在使用threading.Thread()时出现RuntimeError?

来自分类Dev

用System.Threading.Timer替换Thread.Sleep吗?

来自分类Dev

java multi threading..thread相互通信

来自分类Dev

不再支持tensorflow.train.threading.Thread吗?

来自分类Dev

python函数不会使用threading.timer每n秒调用一次

来自分类Dev

Xamarin-Java.Lang.Thread与System.Threading.Thread-使用哪个?

来自分类Dev

Xamarin-Java.Lang.Thread与System.Threading.Thread-使用哪个?

来自分类Dev

如何清除Python threading.local对象?

来自分类Dev

查询Python的threading.Lock是否被锁定

Related 相关文章

  1. 1

    停止python中的threading.Thread

  2. 2

    停止python中的threading.Thread

  3. 3

    Python 多功能多线程与threading.Thread?(可变线程数)

  4. 4

    异步功能不会将控制权返回给主线程(linq表达式)

  5. 5

    python-是否在threading.Thread类上返回释放所有内存?

  6. 6

    threading.Thread.start()方法的执行时间取决于Thread目标方法

  7. 7

    使用threading.Thread.join()

  8. 8

    为什么threading.Thread通过阻止python 2.5中的执行来同步运行?

  9. 9

    ExecuteAsync不会将控制权返回给调试器

  10. 10

    覆盖threading.Thread对象中的start()函数有什么问题?

  11. 11

    调用某个线程的start()方法后,主线程是否立即获得控制权?

  12. 12

    Python显然继续无法将控制权返回到while循环

  13. 13

    异步方法不会将控制权返回给调用者

  14. 14

    ssh脚本不会将控制权返回给父脚本

  15. 15

    异步方法不会将控制权返回给调用者

  16. 16

    从命令行打开Nautilus会产生错误,不会将控制权返回给终端

  17. 17

    python and ipython threading.activeCount()

  18. 18

    System.Threading.Thread.Sleep(1000)与System.Threading.Tasks.Task.Delay(1000).Wait()

  19. 19

    为什么使用System.Threading.Thread.Sleep()是不好的做法?

  20. 20

    设置System.Threading.Thread.CurrentThread.CurrentCulture的位置

  21. 21

    为什么在使用threading.Thread()时出现RuntimeError?

  22. 22

    用System.Threading.Timer替换Thread.Sleep吗?

  23. 23

    java multi threading..thread相互通信

  24. 24

    不再支持tensorflow.train.threading.Thread吗?

  25. 25

    python函数不会使用threading.timer每n秒调用一次

  26. 26

    Xamarin-Java.Lang.Thread与System.Threading.Thread-使用哪个?

  27. 27

    Xamarin-Java.Lang.Thread与System.Threading.Thread-使用哪个?

  28. 28

    如何清除Python threading.local对象?

  29. 29

    查询Python的threading.Lock是否被锁定

热门标签

归档