English 中文(简体)
它是这部具有共同读写法的沙尔多法。
原标题:Is this Python multithreading code with shared tuple thread-safe

Hello Python and multithreading enthusiasts,

I am working on a challenging scenario where I have a shared tuple with all immutable elements, that is frequently iterated by multiple reading threads. Occasionally, this tuple is replaced by a single thread. I don t need guaranteed immediate replacement in the reading threads.

根据我们的要求,似乎在没有任何问题的情况下工作的守则:

import threading
import time

# Shared tuple
my_tuple = (1, 2, 3, 4, 5)

# Function for thread to iterate over the tuple
def iterate_tuple():
    for element in my_tuple:
        print(f"Thread {threading.current_thread().name} - Element: {element}")
        time.sleep(5)

# Function for another thread to replace the tuple
def replace_tuple():
    global my_tuple

    print("Tuple updated")
    my_tuple = (6, 7, 8, 9, 10)

# Create and start the first iterating thread
iterating_thread = threading.Thread(target=iterate_tuple)
iterating_thread.start()

# Sleep to allow the iterating thread to start
threading.Event().wait(1)

# Replace the original tuple with a new one from another thread
replace_thread = threading.Thread(target=replace_tuple)
replace_thread.start()

# Sleep to allow the iterating thread to start
threading.Event().wait(1)

# Create and start the second iterating thread
iterating_thread2 = threading.Thread(target=iterate_tuple)
iterating_thread2.start()

# Wait for threads to finish
iterating_thread.join()
replace_thread.join()
iterating_thread2.join()

My questions are:

  1. Is this code thread-safe for my use case?
  2. How does the for loop still refer to the old tuple without corrupting the data after replacing the tuple?

我赞赏你可能提出的任何见解或建议。 谢谢!

问题回答

Yes, your code is thread safe as your are using immutable objects (tuples). When you replace my_tuple with replace_tuple. You are not modifying the tuple but redirecting my_tuple to a new tuple.

当休息开始穿透镜时,它坚持使用该版本,即使另一个胎面已经改变。 照片像影印一样,即使原版面有改动,你的复印机也保持不变。





相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...

热门标签