Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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_Performance_Multiprocessing_Shared Memory - Fatal编程技术网

多线程:双线程与嵌套线程Python

多线程:双线程与嵌套线程Python,python,multithreading,performance,multiprocessing,shared-memory,Python,Multithreading,Performance,Multiprocessing,Shared Memory,我想尽量加快我的程序。谁能帮我看看哪一个速度更好?根据我的要求,我可以采用任何方法 方法1(从主进程生成2个线程): 方法2(生成嵌套线程): p.S.a和b只是虚拟函数,但它们的工作方式类似。我建议您研究多处理,而不是多个威胁,而较重的python线程有效地将只在一个CPU内核中运行,无论您使用多少个。这是由于GIL锁,这就是为什么使用多处理来解决这个问题 另一种选择是使用PyPy,这是一种不同于官方的python实现,在某些情况下没有GIL,可以实现多线程效率。线程的共存是平面的,而不是层次

我想尽量加快我的程序。谁能帮我看看哪一个速度更好?根据我的要求,我可以采用任何方法

方法1(从主进程生成2个线程):

方法2(生成嵌套线程):


p.S.a和b只是虚拟函数,但它们的工作方式类似。

我建议您研究多处理,而不是多个威胁,而较重的python线程有效地将只在一个CPU内核中运行,无论您使用多少个。这是由于GIL锁,这就是为什么使用多处理来解决这个问题


另一种选择是使用PyPy,这是一种不同于官方的python实现,在某些情况下没有GIL,可以实现多线程效率。线程的共存是平面的,而不是层次的。一个线程不在另一个线程内运行。(我很确定这是CPython的情况,如果有人能检查一下就好了)

换句话说,在主线程中生成的线程和在任何其他线程(您所指的嵌套线程)中生成的线程之间没有区别

关于两种方法之间的其他小差异(例如全局变量和局部变量),它们几乎不会影响速度


最后,在这种特殊情况下,多线程将按预期工作,Python臭名昭著的GIL锁不会产生任何影响(通过重新调度线程可以避免
time.sleep()
阻塞)。

我需要跨线程共享内存,而在多处理中共享内存不是直接的,可能会降低速度。让我看看你建议的PyPy。好吧,没有什么大区别。关于你提到的最后一部分,重新调度线程和休眠线程,哪一个更好?休眠线程的重新调度是自动发生的。我只是说,对于那个特定的情况,每当
time.sleep()
阻塞一个线程时,另一个线程就会运行。换句话说,Python的多线程将具有加速效果,并且您“不需要”多处理。
def a(something):
    # Does something at fixed interval
    while 1:
        print("a")
        time.sleep(60)


def b(something):
    # Keeps running for infinitely without any delay.
    while 1:
        print("b")


def main():

    something = {}

    t1 = threading.Thread(target=b, args=(something,))
    t1.start()

    t2 = threading.Thread(target=a, args=(something,))
    t2.start()
def a(something):
    # Does something at fixed interval
    while 1:
        print("a")
        time.sleep(60)


def b(something):
    t2 = threading.Thread(target=a, args=(something,))
    t2.start()
    # Keeps running for infinitely without any delay.
    while 1:
        print("b")


def main():

    something = {}

    t1 = threading.Thread(target=b, args=(something,))
    t1.start()