日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

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

發(fā)布時(shí)間:2024/9/30 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python多任务(多线程执行带有参数的任务,利用threading创建线程时传入参数--args参数和kwargs参数) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

1.多線程執(zhí)行帶有參數(shù)的任務(wù)

以元組形式傳參

以字典方式進(jìn)行傳參? ? ? ?(字典的key值和參數(shù)名要一致)

2.線程的注意點(diǎn)

線程之間執(zhí)行是無序的

主線程會(huì)等待所有的子線程執(zhí)行結(jié)束再結(jié)束

如果要主線程不等待子線程結(jié)束再結(jié)束,可以把子線程設(shè)置為守護(hù)線程,?主線程退出后子線程直接銷毀。

線程之間共享全局變量

如果想讓? 添加數(shù)據(jù)的子線程執(zhí)行完之后再執(zhí)行讀取數(shù)據(jù)的代碼??join()方法,線程等待,


1.多線程執(zhí)行帶有參數(shù)的任務(wù)

? ?Thread?類執(zhí)行任務(wù)并給任務(wù)傳參數(shù)有兩種方式:

  • args:? ? ?指定將來調(diào)用 函數(shù)的時(shí)候? ?傳遞什么數(shù)據(jù)過去
    ? ? ? ? ? ? ? ? ??args參數(shù)指定的一定是一個(gè)元組類型
  • kwargs?表示以字典方式給執(zhí)行任務(wù)傳參

  • 以元組形式傳參

import threading import time g_nums = [1,2]def test1(temp):temp.append(33)print("-----in test1 temp=%s-----"% str(temp))def test2(temp):print("-----in test2 temp=%s-----"% str(temp))def main():t1 = threading.Thread(target=test1,args=(g_nums,)) # 加上要傳遞的參數(shù),元組類型t2 = threading.Thread(target=test2, args=(g_nums,)) # args 元組類型t1.start()time.sleep(1)t2.start()time.sleep(1)print("-----in main temp=%s-----"% str(g_nums))if __name__ == '__main__':main()

結(jié)果:

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

  • 以字典方式進(jìn)行傳參? ? ? ?(字典的key值和參數(shù)名要一致)

import threadingdef eat(name, number):print("eating :%s number :%d" % (name, number))def watch(name, type):print("watch : %s type:%s" % (name, type))if __name__ == '__main__':eat_thread = threading.Thread(target=eat, kwargs={"name": "爆米花", "number": 1})watch_thread = threading.Thread(target=watch, kwargs={"name": "電影", "type": "科幻"})eat_thread.start()watch_thread.start()

運(yùn)行結(jié)果:

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

2.線程的注意點(diǎn)

  • 線程之間執(zhí)行是無序的
  • 主線程會(huì)等待所有的子線程執(zhí)行結(jié)束再結(jié)束
  • 線程之間共享全局變量
  • 線程之間共享全局變量數(shù)據(jù)出現(xiàn)錯(cuò)誤問題
    • 線程之間執(zhí)行是無序的

    import threading import timedef task():time.sleep(0.2)# 獲取當(dāng)前線程print(threading.current_thread())if __name__ == '__main__':for i in range(20):# 每循環(huán)一次創(chuàng)建一個(gè)子線程sub_thread = threading.Thread(target=task)# 啟動(dòng)子線程sub_thread.start()

    ?通過下方的運(yùn)行結(jié)果可以看出,? ?線程之間的執(zhí)行確實(shí)是無序的,具體哪個(gè)線程執(zhí)行是由cpu調(diào)度決定的

    • 主線程會(huì)等待所有的子線程執(zhí)行結(jié)束再結(jié)束

    import threading import timedef task():while True:print("子線程任務(wù)執(zhí)行中***")time.sleep(0.2)if __name__ == '__main__':# 創(chuàng)建子線程sub_thread = threading.Thread(target=task)sub_thread.start()# 主線程延遲執(zhí)行1秒time.sleep(1)print("主線程over")

    ?運(yùn)行結(jié)果:? 子線程一直會(huì)執(zhí)行,主線程會(huì)等待子線程結(jié)束再結(jié)束

    • 如果要主線程不等待子線程結(jié)束再結(jié)束,可以把子線程設(shè)置為守護(hù)線程,?主線程退出后子線程直接銷毀。

    ? ? 第一種方式:??daemon=True

    # daemon=True 表示創(chuàng)建的子線程守護(hù)主線程,主線程退出子線程直接銷毀sub_thread = threading.Thread(target=task, daemon=True)

    第二種方式:setDaemon(True)

    sub_thread = threading.Thread(target=task)sub_thread.setDaemon(True)sub_thread.start()
    • 線程之間共享全局變量

    import threading# 定義全局變量 g_list = []# 添加數(shù)據(jù) def add_data():for i in range(10):# 每循環(huán)一次就把數(shù)據(jù)添加到全局變量中g(shù)_list.append(i)print("add: ", i)# 讀取數(shù)據(jù) def read_data():print("read:", g_list)if __name__ == '__main__':# 創(chuàng)建子線程add_thread = threading.Thread(target=add_data)read_thread = threading.Thread(target=read_data)add_thread.start()read_thread.start()

    運(yùn)行結(jié)果:? 可以共同訪問一個(gè)變量

    • 如果想讓? 添加數(shù)據(jù)的子線程執(zhí)行完之后再執(zhí)行讀取數(shù)據(jù)的代碼??join()方法,線程等待

    ? join()方法,線程等待(線程同步的一種方式,保證同一時(shí)刻只能有一個(gè)線程去操作全局變量,同步就是按照預(yù)先的先后次序進(jìn)行運(yùn)行,比如現(xiàn)實(shí)生活中的對(duì)講機(jī),你說完,我再說),讓第一個(gè)線程執(zhí)行完之后再執(zhí)行第二個(gè)線程,保證數(shù)據(jù)不會(huì)有問題

    add_thread.start()add_thread.join()read_thread.start()

    總結(jié)

    以上是生活随笔為你收集整理的Python多任务(多线程执行带有参数的任务,利用threading创建线程时传入参数--args参数和kwargs参数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。