当前位置:   article > 正文

Python多任务(多线程执行带有参数的任务,利用threading创建线程时传入参数--args参数和kwargs参数)_python threading args

python threading args

1.多线程执行带有参数的任务

以元组形式传参

以字典方式进行传参       (字典的key值和参数名要一致)

2.线程的注意点

线程之间执行是无序的

主线程会等待所有的子线程执行结束再结束

如果要主线程不等待子线程结束再结束,可以把子线程设置为守护线程, 主线程退出后子线程直接销毁。

线程之间共享全局变量

如果想让  添加数据的子线程执行完之后再执行读取数据的代码  join()方法,线程等待,


1.多线程执行带有参数的任务

   Thread 类执行任务并给任务传参数有两种方式:

  • args:     指定将来调用 函数的时候   传递什么数据过去
                      args参数指定的一定是一个元组类型
  • kwargs 表示以字典方式给执行任务传参

  • 以元组形式传参

  1. import threading
  2. import time
  3. g_nums = [1,2]
  4. def test1(temp):
  5. temp.append(33)
  6. print("-----in test1 temp=%s-----"% str(temp))
  7. def test2(temp):
  8. print("-----in test2 temp=%s-----"% str(temp))
  9. def main():
  10. t1 = threading.Thread(target=test1,args=(g_nums,)) # 加上要传递的参数,元组类型
  11. t2 = threading.Thread(target=test2, args=(g_nums,)) # args 元组类型
  12. t1.start()
  13. time.sleep(1)
  14. t2.start()
  15. time.sleep(1)
  16. print("-----in main temp=%s-----"% str(g_nums))
  17. if __name__ == '__main__':
  18. main()

结果:

 -----in test1 temp=[1, 2, 33]-----
-----in test2 temp=[1, 2, 33]-----
-----in main temp=[1, 2, 33]-----

  • 以字典方式进行传参       (字典的key值和参数名要一致)

  1. import threading
  2. def eat(name, number):
  3. print("eating :%s number :%d" % (name, number))
  4. def watch(name, type):
  5. print("watch : %s type:%s" % (name, type))
  6. if __name__ == '__main__':
  7. eat_thread = threading.Thread(target=eat, kwargs={"name": "爆米花", "number": 1})
  8. watch_thread = threading.Thread(target=watch, kwargs={"name": "电影", "type": "科幻"})
  9. eat_thread.start()
  10. watch_thread.start()

运行结果:

eating :爆米花 number :1
watch : 电影 type:科幻
 

2.线程的注意点

  1. 线程之间执行是无序的
  2. 主线程会等待所有的子线程执行结束再结束
  3. 线程之间共享全局变量
  4. 线程之间共享全局变量数据出现错误问题
  • 线程之间执行是无序的

  1. import threading
  2. import time
  3. def task():
  4. time.sleep(0.2)
  5. # 获取当前线程
  6. print(threading.current_thread())
  7. if __name__ == '__main__':
  8. for i in range(20):
  9. # 每循环一次创建一个子线程
  10. sub_thread = threading.Thread(target=task)
  11. # 启动子线程
  12. sub_thread.start()

 通过下方的运行结果可以看出,   线程之间的执行确实是无序的,具体哪个线程执行是由cpu调度决定的

  • 主线程会等待所有的子线程执行结束再结束

  1. import threading
  2. import time
  3. def task():
  4. while True:
  5. print("子线程任务执行中***")
  6. time.sleep(0.2)
  7. if __name__ == '__main__':
  8. # 创建子线程
  9. sub_thread = threading.Thread(target=task)
  10. sub_thread.start()
  11. # 主线程延迟执行1秒
  12. time.sleep(1)
  13. print("主线程over")

 运行结果:  子线程一直会执行,主线程会等待子线程结束再结束

  • 如果要主线程不等待子线程结束再结束,可以把子线程设置为守护线程, 主线程退出后子线程直接销毁。

    第一种方式:  daemon=True

  1. # daemon=True 表示创建的子线程守护主线程,主线程退出子线程直接销毁
  2. sub_thread = threading.Thread(target=task, daemon=True)

第二种方式:setDaemon(True)

  1. sub_thread = threading.Thread(target=task)
  2. sub_thread.setDaemon(True)
  3. sub_thread.start()
  • 线程之间共享全局变量

  1. import threading
  2. # 定义全局变量
  3. g_list = []
  4. # 添加数据
  5. def add_data():
  6. for i in range(10):
  7. # 每循环一次就把数据添加到全局变量中
  8. g_list.append(i)
  9. print("add: ", i)
  10. # 读取数据
  11. def read_data():
  12. print("read:", g_list)
  13. if __name__ == '__main__':
  14. # 创建子线程
  15. add_thread = threading.Thread(target=add_data)
  16. read_thread = threading.Thread(target=read_data)
  17. add_thread.start()
  18. read_thread.start()

运行结果:  可以共同访问一个变量

  • 如果想让  添加数据的子线程执行完之后再执行读取数据的代码  join()方法,线程等待

  join()方法,线程等待(线程同步的一种方式,保证同一时刻只能有一个线程去操作全局变量,同步就是按照预先的先后次序进行运行,比如现实生活中的对讲机,你说完,我再说),让第一个线程执行完之后再执行第二个线程,保证数据不会有问题

  1. add_thread.start()
  2. add_thread.join()
  3. read_thread.start()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/143414
推荐阅读
相关标签
  

闽ICP备14008679号