首先,这是我所指的代码:
from random import randint
import time
from threading import Thread
import Queue
class TestClass(object):
def __init__(self, queue):
self.queue = queue
def do(self):
while True:
wait = randint(1, 10)
time.sleep(1.0/wait)
print '[>] Enqueuing from TestClass.do...', wait
self.queue.put(wait)
class Handler(Thread):
def __init__(self, queue):
Thread.__init__(self)
self.queue = queue
def run(self):
task_no = 0
while True:
task = self.queue.get()
task_no += 1
print ('[<] Dequeuing from Handler.run...', task,
'task_no=', task_no)
time.sleep(1) # emulate processing time
print ('[*] Task %d done!') % task_no
self.queue.task_done()
def main():
q = Queue.Queue()
watchdog = TestClass(q)
observer = Thread(target=watchdog.do)
observer.setDaemon(True)
handler = Handler(q)
handler.setDaemon(True)
handler.start()
observer.start()
try:
while True:
wait = randint(1, 10)
time.sleep(1.0/wait)
print '[>] Enqueuing from main...', wait
q.put(wait)
except KeyboardInterrupt:
print '[*] Exiting...', True
if __name__ == '__main__':
main()
虽然代码对我的问题不是很重要,但它是一个简单的脚本,在主要代码之上生成2个线程。其中两个将“任务”排入队列,一个队列出局并“执行”它们。
我刚刚开始在python中学习线程,我当然遇到了GIL的主题,所以我希望有一个进程。但问题是,当我用htop监视这个特定的脚本时,我注意到不是1,而是产生了3个进程。
这怎么可能?
答案 0 :(得分:1)
GIL意味着一次只有一个线程“可以正常工作”,但这并不意味着Python不会产生线程。在您的情况下,您要求Python生成两个线程,因此它(总共提供三个线程)。仅供参考,top会列出进程和线程,以免引起您的混淆。
Python线程在您需要并发但不需要并行性时非常有用。并发是一种使程序更简单,更模块化的工具;它允许你为每个任务生成一个线程,而不必编写一个大的(通常是凌乱的)while循环和/或使用一堆回调(如JavaScript)。
如果您对此主题感兴趣,我建议使用Google搜索“并发与并行”。这个概念不是语言特定的。
编辑:另外,你可以阅读this Stack Overflow线程。