python线程的使用:

    1. # 使用线程必要添加的模块 threading
    2. import threading
    3. # 提供一个线程的起始位置(线程回调函数)
    4. def worker():
    5. for i in range(1000):
    6. # 循环输出一千次线程名称(创建线程指定)
    7. # 在 Python 中线程由 pvm 维护,是伪线程
    8. print(i, threading.current_thread().name)
    9. # 如果当前的模块是主模块就执行
    10. if __name__ == "__main__":
    11. # 创建了一个线程对象,指定起始位置和名称
    12. t = threading.Thread(target=worker, name="worker")
    13. # 执行线程
    14. t.start()
    15. # 输出主线程的名称,应该和线程的输出是交替的
    16. for i in range(1000):
    17. print(i, threading.current_thread().name)
    18. # 主线程等待线程执行完毕
    19. t.join()
    20. import time
    21. # 使用线程模块中提供的锁 Lock
    22. lock = threading.Lock()
    23. # 提供一个线程的起始位置(线程回调函数)
    24. def worker():
    25. for i in range(1000):
    26. # 将需要保护的代码添加到 acquire 和 release 中间
    27. time.sleep(0.1)
    28. lock.acquire()
    29. print(i, threading.current_thread().name)
    30. lock.release()
    31. # 如果当前的模块是主模块就执行
    32. if __name__ == "__main__":
    33. # 创建了一个线程对象,并直接执行
    34. threading.Thread(target=worker, name="worker").start()
    35. # 输出主线程的名称,应该和线程的输出是交替的
    36. for i in range(1000):
    37. time.sleep(0.1)
    38. lock.acquire()
    39. print(i, threading.current_thread().name)
    40. lock.release()
    41. # 一个变参函数,接收的数据被打包成元组
    42. def worker_thread1(*args):
    43. print(type(args), args)
    44. # 一个变参函数,接收的数据被打包成字典
    45. def worker_thread2(**kwargs):
    46. print(type(kwargs), kwargs)
    47. # 可以传入元组和键值对
    48. def worker_thread3(*args, **kwargs):
    49. print(type(args), args)
    50. print(type(kwargs), kwargs)
    51. # 创建线程,传入多个参数
    52. threading.Thread(target=worker_thread1, args=(1, 2, 3)).start()
    53. # 传递字典到线程回调函数中时,键应该是一个字符串
    54. threading.Thread(target=worker_thread2, kwargs={"a":1, "b": 2}).start()
    55. threading.Thread(target=worker_thread3, args=(1, 2, 3), kwargs={"a":1, "b": 2}).start()
    56. # 在 Python 中不建议使用递归,函数的递归有一定的次数限制,大概是 1000
    57. # 因为 Python 执行在 pvm 中,效率不够高,不推荐递归