该蟒蛇线程 文档指出"......线程仍然是一个合适的模型,如果你想同时运行多个I/O密集型任务",这显然是因为I/O密集型进程能够避免,防止线程并发执行的GIL CPU绑定任务.
但我不明白的是I/O任务仍然使用CPU.那怎么能不遇到同样的问题呢?是因为I/O绑定任务不需要内存管理吗?
我很好奇python中的Global Interpreter Lock实际上是如何工作的.如果我有一个c ++应用程序启动python脚本的四个单独实例将在不同的内核上并行运行,或者GIL是否更深入,然后只是启动的单个进程并控制所有python进程,无论生成它的进程如何?
由于GIL,我认为多线程python进程一次只能运行一个线程,因此cpu使用率不能超过100%.
但我发现下面的代码可以占用顶部950%的CPU使用率.
import threading
import time
def f():
while 1:
pass
for i in range(10):
t = threading.Thread(target=f)
t.setDaemon(True)
t.start()
time.sleep(60)
Run Code Online (Sandbox Code Playgroud)
这与Python解释器使用高达130%的CPU的问题不同.怎么可能?.在那个问题中,OP表示他正在进行I/O密集型负载测试,这可能会释放GIL.但在我的程序中,没有I/O操作.
测试在CPython 2.6.6上运行.
下面发布的代码启动了一个线程,该线程在我的macbookpro上启动了4个内核。有没有一种方法可以限制线程应使用多少个内核?
import threading
import logging
logging.basicConfig(level=logging.DEBUG, format='(%(threadName)s) %(message)s',)
def func():
logging.debug('starting')
m=0
for i in range(500000000):
m+=i
logging.debug('exiting')
thread = threading.Thread(target=func)
thread.start()
logging.debug('completed')
Run Code Online (Sandbox Code Playgroud)
这是日志:
Loaded sitecustomize.py
(Thread-1) starting
(MainThread) completed
(Thread-1) exiting
[Finished in 128.0s]
Run Code Online (Sandbox Code Playgroud)