Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python启动多个线程?_Python_Multithreading - Fatal编程技术网

使用python启动多个线程?

使用python启动多个线程?,python,multithreading,Python,Multithreading,我正在尝试吞咽线程,并从本周的Python模块示例开始: 根据下面的代码 import threading def worker(arg=None): """thread worker function""" print 'Worker thread: %s\n' % arg return threads = [] for i in range(5): t = threading.Thread(target=worker, args=str(i), name=

我正在尝试吞咽线程,并从本周的Python模块示例开始:

根据下面的代码

import threading

def worker(arg=None):
    """thread worker function"""
    print 'Worker thread: %s\n' % arg
    return

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=str(i), name="threadingPrac")
    threads.append(t)
    t.start()
这是否意味着我开始5个线程

我刚开始学习线程,所以想更好地理解它。

是的

在print语句之后添加
import time
time.sleep(5)
,以便更好地查看它

import threading
import time

def worker(arg=None):
    """thread worker function"""
    print 'Worker thread: %s\n' % arg
    time.sleep(5)
    return

threads = []
for i in range(5):
    t = threading.Thread(target=worker, args=str(i), name="threadingPrac")
    threads.append(t)
    t.start()

是,您可以通过在代码底部添加此行来检查列表
线程的长度:

print len(threads)
输出:

5 #Number of threads

我不明白的是,这些线程并不是同时启动的,因为for循环一个接一个地执行每个线程,所以线程化有什么帮助呢?这是否意味着,当第一个线程启动,第二个线程在下一个迭代级别被调用时,第二个线程将与第一个线程并行执行,依此类推?也许您应该阅读一些关于线程的一般文本。你可以从……开始。是的,你是对的。每个后续线程将在每个循环中启动并执行其操作。Python受到吉尔的影响,因此您应该考虑仅在I/O绑定任务而不是计算任务的情况下使用线程。如果是计算任务并且想要实现并行处理,你应该使用多处理。你能给我举一个例子说明计算任务和线程失败吗?@san线程实际上并不是“失败”,而是因为全局解释器锁(GIL),大多数情况下,一次只能执行一个线程,即使您有多个CPU核。因此,在CPU受限的任务中使用线程通常不会比使用单个线程更快。它有时甚至比单个线程还要慢,因为在线程之间反复切换会产生额外的开销。当您想要并行化CPU限制的任务时,请使用
多处理
,它使用多个进程而不是线程,因此不受GIL的影响。