在python中使用多线程以模式打印变量

在python中使用多线程以模式打印变量,python,python-3.x,multithreading,python-multithreading,Python,Python 3.x,Multithreading,Python Multithreading,目标是打印: 斐波那契编号: Fibo的平方: 主要编号: 素数的平方: 在使用多线程的前10个变量的模式中。 这是我的密码: import threading import time def FibonacciNumbers(n): f1 = 0 f2 = 1 if (n < 1): return for x in range(0, n): print("Fibonacci No.: ")

目标是打印: 斐波那契编号: Fibo的平方: 主要编号: 素数的平方: 在使用多线程的前10个变量的模式中。
这是我的密码:

import threading
import time

def FibonacciNumbers(n):
    f1 = 0
    f2 = 1
    if (n < 1):
        return
    for x in range(0, n):
        print("Fibonacci No.: ")
        print(f2)
        time.sleep(1)
        next = f1 + f2
        f1 = f2
        f2 = next

def FibonacciSq(n):
    f1 = 0
    f2 = 1
    if (n < 1):
        return
    for x in range(0, n):
        print("Square of Fibo: ")
        print(f2*f2)
        time.sleep(1)
        next = f1 + f2
        f1 = f2
        f2 = next

def prime(x):
    i=1
    counter = 0
    while True:
        c=0;
        for j in range (1, (i+1), 1):
            a = i%j
            if (a==0):
                c = c+1
        if (c==2):
            print("Prime No: ")
            print (i)
            time.sleep(1)
            counter = counter + 1
            if counter >= x:
                break
        i=i+1

def primeSq(x):
    i=1
    counter = 0
    while True:
        c=0;
        for j in range (1, (i+1), 1):
            a = i%j
            if (a==0):
                c = c+1
        if (c==2):
            print("Square of the Prime Number: ")
            print (i*i)
            time.sleep(1)
            counter = counter + 1
            if counter >= x:
                break
        i=i+1


if __name__ == "__main__":
    t1 = threading.Thread(target=FibonacciNumbers, args=(10,))
    t2 = threading.Thread(target=FibonacciSq, args=(10,))
    t3 = threading.Thread(target=prime, args=(10,))
    t4 = threading.Thread(target=primeSq, args=(10,))
    t1.start()
    time.sleep(1)
    # t1.join()

    t2.start()
    time.sleep(1)
    # t2.join()

    t3.start()
    time.sleep(1)
    # t3.join()

    t4.start()
    time.sleep(1)
    # t4.join()
    t1.join()
    t2.join()
    t3.join()
    t4.join()

    print("Done!")

当多个线程同时访问单个资源(在本例中为标准输出)时,您需要以某种方式同步访问(意思是:让除一个线程之外的所有线程等待,直到资源可以再次自由使用)

根据具体的用例,有几种解决方案。最通用的解决方案是使用一个。这需要两个变化:

  • 在文件开头声明全局锁:

    lock = threading.Lock()
    
  • 在每个函数中,将两个
    print
    语句包装在锁定块中,例如:

    with lock:
        print("Fibonacci No.: ")
        print(f2)
    
  • 请注意,以这种方式锁定是一种效率很低的操作!如果使用并发的目的是提高性能,那么这个解决方案很可能完全无法达到这个目的。编写高效的多线程代码绝非易事,而高效的同步尤其需要大量的工作。(这增加了复杂性,因为最常见的Python实现使用了a,这意味着大部分执行实际上并不是并行进行的。)


    在大多数情况下,最简单、实用、高效的解决方案是避免在线程之间共享资源。在您的情况下,这意味着不写入任何输出(写入输出的函数通常是可疑的):让每个函数生成结果并在列表中收集它们,或者
    将它们作为生成器生成。然后,您可以并行生成结果,然后按顺序打印它们(但这样做需要进行更改,因为
    线程化
    不容易支持返回值的函数;但是,模块
    concurrent.futures
    可以).

    如果不希望代码同时运行,为什么要使用线程?@KonradRudolph我想获得输出。如果你说的是睡眠。我用它来获取输出,这不是我要说的。去除螺纹材料。直接调用函数。您将得到相同的输出,只是顺序正确。@KonradRudolph我的任务是使用线程使其工作。如果你能指导我在哪里修改,那将是很大的帮助。我不能脱线这很好!但是使用lock并不能提供所需的输出。但我明白你的意思。
    with lock:
        print("Fibonacci No.: ")
        print(f2)