python线程的使用:
# 使用线程必要添加的模块 threading
import threading
# 提供一个线程的起始位置(线程回调函数)
def worker():
for i in range(1000):
# 循环输出一千次线程名称(创建线程指定)
# 在 Python 中线程由 pvm 维护,是伪线程
print(i, threading.current_thread().name)
# 如果当前的模块是主模块就执行
if __name__ == "__main__":
# 创建了一个线程对象,指定起始位置和名称
t = threading.Thread(target=worker, name="worker")
# 执行线程
t.start()
# 输出主线程的名称,应该和线程的输出是交替的
for i in range(1000):
print(i, threading.current_thread().name)
# 主线程等待线程执行完毕
t.join()
import time
# 使用线程模块中提供的锁 Lock
lock = threading.Lock()
# 提供一个线程的起始位置(线程回调函数)
def worker():
for i in range(1000):
# 将需要保护的代码添加到 acquire 和 release 中间
time.sleep(0.1)
lock.acquire()
print(i, threading.current_thread().name)
lock.release()
# 如果当前的模块是主模块就执行
if __name__ == "__main__":
# 创建了一个线程对象,并直接执行
threading.Thread(target=worker, name="worker").start()
# 输出主线程的名称,应该和线程的输出是交替的
for i in range(1000):
time.sleep(0.1)
lock.acquire()
print(i, threading.current_thread().name)
lock.release()
# 一个变参函数,接收的数据被打包成元组
def worker_thread1(*args):
print(type(args), args)
# 一个变参函数,接收的数据被打包成字典
def worker_thread2(**kwargs):
print(type(kwargs), kwargs)
# 可以传入元组和键值对
def worker_thread3(*args, **kwargs):
print(type(args), args)
print(type(kwargs), kwargs)
# 创建线程,传入多个参数
threading.Thread(target=worker_thread1, args=(1, 2, 3)).start()
# 传递字典到线程回调函数中时,键应该是一个字符串
threading.Thread(target=worker_thread2, kwargs={"a":1, "b": 2}).start()
threading.Thread(target=worker_thread3, args=(1, 2, 3), kwargs={"a":1, "b": 2}).start()
# 在 Python 中不建议使用递归,函数的递归有一定的次数限制,大概是 1000
# 因为 Python 执行在 pvm 中,效率不够高,不推荐递归