Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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 thread.start()不';在切换上下文之前是否运行到完成?_Python_Python 3.x_Multithreading_Python Multithreading - Fatal编程技术网

python thread.start()不';在切换上下文之前是否运行到完成?

python thread.start()不';在切换上下文之前是否运行到完成?,python,python-3.x,multithreading,python-multithreading,Python,Python 3.x,Multithreading,Python Multithreading,有人能解释一下Python线程是如何工作的吗?thread.start()在切换回另一个上下文(如下面的main)之前,是否不运行目标函数直到完成 import time import threading def threadfunc(): # time.sleep(1) print('thread print 1', flush=True) print('thread print 2', flush=True) #time.sleep(1) print('b

有人能解释一下Python线程是如何工作的吗?thread.start()在切换回另一个上下文(如下面的main)之前,是否不运行目标函数直到完成

import time
import threading

def threadfunc():
    # time.sleep(1)
    print('thread print 1', flush=True)
    print('thread print 2', flush=True)
    #time.sleep(1)

print('before thread', flush=True)

thread1 = threading.Thread(target=threadfunc)
thread1.start()

print('after thread', flush=True)
输出:

before thread
thread print 1
after thread
thread print 2 #shouldn't this be after "print 1"?

正如注释所解释的,这不是线程或GIL在Python中的工作方式

CPython底层的许多C代码将释放GIL,IO操作(正如Solomon所指出的)将实现这一点,而一些库(例如NumPy)显式地释放它只是为了帮助多线程代码运行得更快

解释器还将尝试每隔一天切换线程


有关更多详细信息,请参见

,正如注释所解释的,这不是线程或GIL在Python中的工作方式

CPython底层的许多C代码将释放GIL,IO操作(正如Solomon所指出的)将实现这一点,而一些库(例如NumPy)显式地释放它只是为了帮助多线程代码运行得更快

解释器还将尝试每隔一天切换线程


有关更多详细信息,请参见

如果
thread.start()
会等待线程完成,那么使用线程有什么意义呢?在countrary上。不应在“print1”之后打印。您正在独立线程中运行该函数。因此,代码将继续执行。这就是为什么我们使用线程,这样代码执行就不会等到函数完成,否则在第一种情况下线程的意义是什么?你们两个都没有解释Python代码是如何决定执行的。线程仍然被GIL阻塞,因此通常您希望python代码在切换出上下文之前完成。线程必须切换到非运行状态,如使用睡眠功能或执行某些IO。是因为print()被认为是一个输出函数,然后使线程切换上下文吗?Re,“…是因为print()是一个输出函数吗?”可能是的。我不知道C Python的内部结构,但我会假设对操作系统的任何调用都可能是一个屈服点,并且我会假设任何可能阻塞I/O的系统调用一定是一个屈服点。如果这不是真的,如果你不能使用线程进行多处理(因为GIL,你不能这样做),那么实际上就没有理由使用线程了。它只需要在访问可能与其他线程共享的数据结构(例如,任何Python对象)时锁定它。原则上,它可以在每两个基本语句之间解锁、屈服,然后再次锁定。我不知道它是否真的这样做了,但我确信(出于我上面给出的原因),它必须在每次潜在的阻塞系统调用之前解锁GIL。如果
thread.start()
会等待线程完成,那么使用线程有什么意义呢?在countrary上。不应在“print1”之后打印。您正在独立线程中运行该函数。因此,代码将继续执行。这就是为什么我们使用线程,这样代码执行就不会等到函数完成,否则在第一种情况下线程的意义是什么?你们两个都没有解释Python代码是如何决定执行的。线程仍然被GIL阻塞,因此通常您希望python代码在切换出上下文之前完成。线程必须切换到非运行状态,如使用睡眠功能或执行某些IO。是因为print()被认为是一个输出函数,然后使线程切换上下文吗?Re,“…是因为print()是一个输出函数吗?”可能是的。我不知道C Python的内部结构,但我会假设对操作系统的任何调用都可能是一个屈服点,并且我会假设任何可能阻塞I/O的系统调用一定是一个屈服点。如果这不是真的,如果你不能使用线程进行多处理(因为GIL,你不能这样做),那么实际上就没有理由使用线程了。它只需要在访问可能与其他线程共享的数据结构(例如,任何Python对象)时锁定它。原则上,它可以在每两个基本语句之间解锁、屈服,然后再次锁定。我不知道它是否真的这样做了,但我确信(出于我上面给出的原因),它必须在每次可能阻塞系统调用之前解锁GIL。