第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么這個(gè)數(shù)組值被刪除,但仍然打???

為什么這個(gè)數(shù)組值被刪除,但仍然打?。?/h1>
HUH函數(shù) 2022-09-27 15:09:38
這個(gè)腳本是我擁有的一個(gè)更大的腳本的非常簡(jiǎn)單的版本,我在這里做的事情是刪除“pip”,如果有這樣的數(shù)組值。但是當(dāng)?shù)诙€(gè)周期到來(lái)時(shí)(甚至更多),pip繼續(xù)在屏幕上打印,我不想這樣做。import requests, threading, random, string, json, time, queue, renum_worker_threads = int(input("Threads: "))lista = ['asd', 'asdjk', 'pip', 'lasd', 'lol']print(str(lista))def do_work(i):    try:        print(i.strip())        print(str(lista))        if i == "pip":            lista.remove("pip")    except Exception as e:        print(e)def worker():    while True:        item = q.get()        if item is not None:            do_work(item)            q.task_done()q = queue.Queue()threads = []for i in range(num_worker_threads):    t = threading.Thread(target=worker)    t.start()    threads.append(t)for i in range(2): # I have only put 2 cycles    for line in lista:        q.put(line)q.join()for i in range(num_worker_threads):    q.put(None)for t in threads:    t.join()
查看完整描述

2 回答

?
Helenr

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊

您需要在多線程代碼中進(jìn)行一些可靠的并發(fā)控制,您需要確保按順序發(fā)生一些事情:

  • 您需要確保隊(duì)列不會(huì)再次讀取列表,直到線程從隊(duì)列中插入的第一輪中清除為止。pip

  • 您需要確保線程不會(huì)同時(shí)改變相同的元素,這將導(dǎo)致其中一個(gè)線程引發(fā)異常,即它無(wú)法刪除已刪除的元素。

你可以利用 在多線程程序的流上放置一些控制,讓我們聲明一個(gè)名為 的事件,Queue 將等待這個(gè)事件得到滿足,以便它開始其第二次迭代,以查詢列表的所有元素。該事件將在成功從列表中刪除 pip 后由您的一個(gè)線程設(shè)置。Eventfirst_iteration_processsed

代碼示例:

import requests, threading, random, string, json, time, queue, re

from threading import Event

num_worker_threads = int(input("Threads: "))


lista = ['asd', 'asdjk', 'pip', 'lasd', 'lol']

print(str(lista))


iteration_processsed = Event()


iteration_processsed.set()

def do_work(i):

    # global lista

    try:

        print(i.strip())

        print(str(lista))

        if i == "pip":

            lista.remove("pip")

            print("Removed pip successfully")

        if i == "iter_end":

            iteration_processsed.set()

    except Exception as e:

        print(e)



def worker():

    while True:

        item = q.get()

        if item is not None:

            do_work(item)

            q.task_done()



q = queue.Queue()


threads = []


for i in range(num_worker_threads):

    t = threading.Thread(target=worker)

    t.start()

    threads.append(t)


for i in range(3): # I have only put 2 cycles

    iteration_processsed.wait()

    print(f"Iteration {i} started")

    iteration_processsed.clear()


    for line in lista:

        q.put(line)

    q.put('iter_end')


q.join()


for i in range(num_worker_threads):

    q.put(None)


for t in threads:

    t.join()

讓我們?cè)囋囘@個(gè):


Threads: 2

['asd', 'asdjk', 'pip', 'lasd', 'lol']

Iteration 0 started

asd

['asd', 'asdjk', 'pip', 'lasd', 'lol']

asdjk

['asd', 'asdjk', 'pip', 'lasd', 'lol']

pip

['asd', 'asdjk', 'pip', 'lasd', 'lol']

Removed pip successfully

lasd

['asd', 'asdjk', 'lasd', 'lol']

lol

iter_end

['asd', 'asdjk', 'lasd', 'lol']

['asd', 'asdjk', 'lasd', 'lol']

Iteration 1 started

asd

asdjk

['asd', 'asdjk', 'lasd', 'lol']

['asd', 'asdjk', 'lasd', 'lol']

lasd

lol

['asd', 'asdjk', 'lasd', 'lol']

['asd', 'asdjk', 'lasd', 'lol']

iter_end

['asd', 'asdjk', 'lasd', 'lol']

Iteration 2 started

asd

asdjk

['asd', 'asdjk', 'lasd', 'lol']

['asd', 'asdjk', 'lasd', 'lol']

lasd

lol

['asd', 'asdjk', 'lasd', 'lol']

['asd', 'asdjk', 'lasd', 'lol']

iter_end

['asd', 'asdjk', 'lasd', 'lol']


現(xiàn)在,正如你所看到的,在刪除pip之前,第二次迭代永遠(yuǎn)不會(huì)開始,當(dāng)然,這里的實(shí)現(xiàn)離子非常特定于這種情況,但我想你可以把它調(diào)整到你自己的更一般的目的,也許添加更多事件來(lái)鎖定更多的操作,以按照某種預(yù)定義的順序執(zhí)行。您可以從文檔中閱讀有關(guān)事件的更多信息,或者本文是一個(gè)良好的開端,https://www.bogotobogo.com/python/Multithread/python_multithreading_Event_Objects_between_Threads.php


查看完整回答
反對(duì) 回復(fù) 2022-09-27
?
幕布斯6054654

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊

您的代碼具有爭(zhēng)用條件。比賽在以下方面之間進(jìn)行:

  • 主線程,它將嘗試向隊(duì)列添加兩次,每次迭代一次。"pip"lista

  • 工作線程,它們集體從隊(duì)列中提取項(xiàng)目并對(duì)其進(jìn)行處理。如果處理某個(gè)條目,則會(huì)將其從 中刪除。"pip"lista

如果第一個(gè)條目由工作線程處理,并在迭代并添加第二個(gè)條目之前從中刪除,則不會(huì)再次處理它。不過,從你對(duì)這個(gè)問題的描述來(lái)看,我猜想,由于 GIL 的某種組合和代碼不同部分的計(jì)時(shí),在工作人員可以對(duì)此做任何事情之前,你非常一致地將 兩個(gè)副本添加到隊(duì)列中。但這并不能得到嚴(yán)格保證。如果在主線程的迭代之間添加了延遲,則可能會(huì)讓工作線程有時(shí)間按預(yù)期趕上并刪除:"pip"lista"pip""pip"lista"pip"

for i in range(2):

    for line in lista:

        q.put(line)

    time.sleep(1) # delay for a second

顯然,這可能不是你真正想做的,因?yàn)樗匀皇且粓?chǎng)比賽,只是一場(chǎng)現(xiàn)在可能被其他賽車手贏得的比賽(不能保證其他線程也不會(huì)花費(fèi)太長(zhǎng)時(shí)間)。更好的解決方案是設(shè)計(jì)代碼,使其完全沒有爭(zhēng)用條件。

一個(gè)想法可能是在列表迭代之間的隊(duì)列中,以便在再次重新添加所有值之前由工作線程處理它們。這與方法非常相似,但它更可靠,因?yàn)橹骶€程將等待,只要工人在添加更多項(xiàng)目之前處理隊(duì)列中的項(xiàng)目。jointime.sleep

另一個(gè)想法可能是在將值放入隊(duì)列之前,在主線程中過濾條目。只是一個(gè)檢查可能會(huì)做到這一點(diǎn)!"pip"if line != "pip"


查看完整回答
反對(duì) 回復(fù) 2022-09-27
  • 2 回答
  • 0 關(guān)注
  • 78 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)