Index
A
- Accelerate package
- about / Accelerate
- reference link / Accelerate
- action function / Streams, transformations, and actions
- arrays
- reference link / GPU arrays
- asyncio module
- about / Asyncio
- reference link / Asyncio
- starting / Getting started
- event loop / Event loops
- tasks / Tasks
- tasks function / Task functions
- futures / Futures
- coroutines / Coroutines
- transports / Transports
- protocols / Protocols
- coroutines, synchronization / Synchronization between coroutines
- BoundedSemaphores / Semaphores and BoundedSemaphores
- semaphore / Semaphores and BoundedSemaphores
- sub-processes / Sub-processes
- asyncio programs
- debugging / Debugging asyncio programs
- debug mode / Debug mode
- as_completed
- using / Using as_completed
- example / Example, Output
B
- barriers
- about / Barriers
- example / Example, Breaking it down, Output
- benchmarking
- about / Benchmarking
- timeit module / The timeit module
- BoundedSemaphores / Bounded semaphores, Semaphores and BoundedSemaphores
C
- callable
- cancelling / Cancelling callable
- example / Example, Output
- callbacks
- setting / Setting callbacks
- example / Example, Output
- chaining / Chaining callbacks
- Celery
- chaining
- about / Operators and chaining
- chained operators / Chained operators
- child threads
- exceptions, catching / Catching exceptions in child threads
- class decorator
- about / Class decorator
- classification / Classification
- client
- about / Listeners and clients
- example / Example, Output
- Client class / The Client class
- clock rate / Clock rate
- cluster analysis / Cluster analysis
- cold observables / Hot and cold observables
- Communicating Sequential Processes (CSP)
- about / Communicating sequential processes
- reference link / Communicating sequential processes
- PyCSP / PyCSP
- compilation options
- about / Compilation options
- nopython / nopython
- nogil / nogil
- cache option / The cache option
- parallel option / The parallel option
- compressed files / Compressed files
- computer memory architecture styles
- about / Computer memory architecture styles
- UMA / UMA
- NUMA / NUMA
- concurrency
- about / History of concurrency, Understanding concurrency, Concurrency
- in CPU / How do they work on a CPU?
- in single-core CPUs / Single-core CPUs
- in clock rate / Clock rate
- Martelli model, of scalability / Martelli model of scalability
- time sharing / Time-sharing - the task scheduler
- in multi-core processors / Multi-core processors
- reference link / Make it work as a single thread
- example / Example, Output
- concurrent.futures
- in Python 2.7 / concurrent.futures in Python 2.7
- concurrent code
- unit testing / Unit testing concurrent code
- concurrent download
- about / Concurrent download
- example / Concurrent download, Breaking it down
- concurrent futures
- about / Concurrent futures
- executor objects / Executor objects
- concurrent image download
- about / Concurrent image download
- sequential download / Sequential download
- concurrent prime factorization
- about / Concurrent prime factorization
- example / Concurrent prime factorization, Breaking it down
- concurrent systems
- properties / Properties of concurrent systems
- condition
- definition / Condition
- example / Example, The results
- publisher class / Our publisher
- subscriber class / Our subscriber
- main function / Kicking it off
- context manager
- timing / Timing context manager
- example / Timing context manager, Output, Example, Output, Example, Output, Example, Output
- about / Context manager, Context Manager, Context manager
- context map
- graph example / Simple graph example
- Continuum Analytics
- URL / Anaconda
- coroutines
- about / Coroutines
- chaining coroutines / Chaining coroutines
- example / Chaining coroutines, Output
- synchronization between / Synchronization between coroutines
- locks / Locks
- queues / Queues
- events / Events and conditions
- conditions / Events and conditions
- cProfile
- about / cProfile
- example / Simple profile example
- CPU-bound bottlenecks / CPU-bound bottlenecks
- critical sections
- about / Critical sections
- filesystem / Filesystem
- life-critical systems / Life-critical systems
- cross-hardware compatibility
- Python, compilation space / Python compilation space
- Just-in-Time (JiT), versus Ahead-of-Time (Aot) compilation / Just-in-Time (JiT) versus Ahead-of-Time (Aot) compilation
- Numba process / The Numba process
- Anaconda / Anaconda
- Numba Python programs, writing / Writing basic Numba Python programs
- compilation options / Compilation options
- Numba, issue / Issues with Numba
- CUDA
- about / CUDA
- working, without NVIDIA graphics card / Working with CUDA without a NVIDIA graphics card
D
- daemon processes
- about / Daemon processes
- example / Example, Breaking it down, Output
- data races
- about / Shared resources and data races
- join method / The join method
- locks / Locks
- RLocks / RLocks
- RLocks, versus regular locks / RLocks versus regular locks
- condition / Condition
- semaphores / Semaphores
- bounded semaphores / Bounded semaphores
- events / Events
- barriers / Barriers
- data science
- about / Data science, Branches of data science, Data science
- machine learning / Machine learning
- classification / Classification
- cluster analysis / Cluster analysis
- data mining / Data mining
- Pandas / Pandas
- Matplotlib / Matplotlib
- debugging
- about / Debugging
- single thread, working as / Make it work as a single thread
- Python Debugger (Pdb) / Pdb
- exceptions, catching in child threads / Catching exceptions in child threads
- decorators, utilizing / Utilizing decorators
- context manager, timing / Timing context manager
- asyncio programs / Debugging asyncio programs
- debug mode
- about / Debug mode
- reference link / Debug mode
- decorator
- about / Decorator
- utilizing / Utilizing decorators
- deque objects
- about / Deque objects
- example / Breakdown, Output
- design aspect, solution
- about / Design
- computationally expensive / Computationally expensive
- event-heavy applications / Event-heavy applications
- I/O-heavy applications / I/O-heavy applications
- references / Recommended design books, Software Architecture with Python
- Dining Philosophers
- about / The Dining Philosophers
- example / Example, Output
E
- elements, appending
- about / Appending elements
- example / Example, Breaking it down, Output
- elements, inserting
- about / Inserting elements
- example / Example, Breaking it down, Output
- elements, popping
- about / Popping elements
- example / Example, Breaking it down, Output
- event-driven libraries / Event-driven and reactive libraries
- event-driven programming
- about / Event-driven programming, Event-driven programming
- event loop / The event loop
- EventEmitters / Event-driven programming
- Event Handler / Event-driven programming
- event loop
- about / Event-driven programming, The event loop, Event loops, Event loops
- run_forever() method / The run_forever() method
- run_until_complete() method / The run_until_complete() method
- stop() method / The stop() method
- is_closed() method / The is_closed() method
- close() function / The close() function
- events
- about / Event-driven programming
- isSet() / Events
- set() / Events
- clear() / Events
- wait() / Events
- example / Breaking it down, Example, Breaking it down, Output
- emitting / Emitting events
- exception classes
- about / Exception classes
- example / Example, Output
- exceptions
- catching, in child threads / Catching exceptions in child threads
- handling / Handling Exceptions
- pipes, using / Using pipes
- executor objects
- about / Executor objects
- ThreadPoolExecutor, creating / Creating a ThreadPoolExecutor
- context manager / Context manager
- maps / Maps
- shutdown / Shutdown of executor objects
- shutdown, example / Example, Output
F
- FIFO (first in first out) queues
- about / FIFO queues
- example / Example, Breaking it down, Output
- Flask
- fork
- used, for process starting / Starting a process using fork
- forking
- about / Forking
- example / Breaking it down
- forkserver / Forkserver
- full/empty queues
- about / Full/empty queues
- example / Example, Output
- fully-typed constructors
- reference link / Fully-typed constructors
- future objects
- about / Future objects
- methods / Methods in future objects
- result() method / The result() method
- add_done_callback() method / The add_done_callback() method
- .running() method / The .running() method
- cancel() method / The cancel() method
- .exception() method / The .exception() method
- .done() method / The .done() method
- callable, cancelling / Cancelling callable
- result, obtaining / Getting the result
- as_completed, using / Using as_completed
- callbacks, setting / Setting callbacks
- exception classes / Exception classes
- future objects, unit testing
- about / Unit testing future objects
- set_running_or_notify_cancel() method / The set_running_or_notify_cancel() method
- set_result() method / The set_result() method
- set_exception() method / The set_exception() method
- futures
G
- gevent
- about / Gevent
- features / Gevent
- reference link / Gevent
- event loop / Event loops
- greenlets / Greenlets
- hostnames example / Simple example-hostnames, Output
- monkey patching / Monkey patching
- global interpreter lock (GIL)
- about / What is multithreading?, The limitations of Python, Working around the GIL
- reference link / The limitations of Python
- working around / Working around the GIL
- sub-processes, utilizing / Utilizing sub-processes
- GPU programming
- about / GPU programming
- PyCUDA / PyCUDA
- OpenCL / OpenCL
- Theano / Theano
- Graphics Processing Units (GPU)
- about / GPU programming, Introduction to GPUs, GPU
- using / Why use the GPU?
- data science / Data science
- arrays / GPU arrays
- Theano, using / Using Theano on the GPU
- reference link / Leveraging multiple GPUs
- context map, defining / Defining the context map
- PyGPU / PyGPU
- greenlets / Greenlets
H
- hot observables / Hot and cold observables
I
- I/O bottlenecks / I/O bottlenecks
- inter-process communication (IPC) / Processes
- IronPython / IronPython
J
- join() function
- about / The join() function
- example / Example, Breakdown, Output
- join method
- about / The join method
- example / Breaking it down
- implementing / Putting it together
- Jython / Jython
K
L
- lambda functions
- about / Lambda functions
- example / Example, Breaking it down, Output
- on_error function / On_next, on_completed, and on_error in lambda form
- on_completed function / On_next, on_completed, and on_error in lambda form
- libraries
- about / Libraries not covered in this book
- GPU / GPU
- reactive libraries / Event-driven and reactive libraries
- event-driven libraries / Event-driven and reactive libraries
- data science / Data science
- LIFO (last in first out) queues
- about / LIFO queues
- example / Example, Breaking it down, Output
- line_profiler tool
- about / The line_profiler tool
- reference link / The line_profiler tool
- Kernprof / Kernprof
- listener
- about / Listeners and clients
- example / Example, Output
- Listener class / The Listener class
- lists
- about / Lists
- filtering / Filtering lists
- example / Output
- LLVM
- locks
- about / Locks
- example / Example, Breaking it down
- logging
M
- machine learning / Machine learning
- main thread
- about / Main thread
- example / Breaking it down
- many-to-many mapping / Many-to-many
- many-to-one mapping / Many-to-one
- maps
- Martelli model
- of scalability / Martelli model of scalability
- Matplotlib
- reference link / Matplotlib
- memory profiling
- about / Memory profiling
- graphs / Memory profile graphs
- monkey patching
- about / Monkey patching
- reference link / Monkey patching
- multi-core processors
- about / Multi-core processors
- advantages / Multi-core processors
- disadvantages / Multi-core processors
- multicasting
- about / Multicasting
- example / Example, Output
- multiple instruction multiple data (MIMD) / MIMD
- multiple instruction single data (MISD) / MISD
- multiprocessing
- about / Multiprocessing
- disadvantages / Multiprocessing
- event-driven programming / Event-driven programming
- turtle / Turtle
- number crunching, improved / Improving number crunching with multiprocessing
- sequential prime factorization / Sequential prime factorization
- concurrent prime factorization / Concurrent prime factorization
- multiprocessing managers
- about / Multiprocessing managers
- namespaces / Namespaces
- queues / Queues
- clients / Listeners and clients
- listeners / Listeners and clients
- logging / Logging
- multiprocessing pools
- about / Multiprocessing pools
- versus concurrent.futures.ProcessPoolExecutor / The difference between concurrent.futures.ProcessPoolExecutor and Pool
- context manager / Context manager
- tasks, submitting to process pool / Submitting tasks to a process pool
- multithreading / Threads and multithreading, What is multithreading?
- multithreading models
- about / Multithreading models
- one-to-one thread mapping / One-to-one thread mapping
- many-to-one mapping / Many-to-one
- many-to-many mapping / Many-to-many
N
- namespaces
- about / Namespaces
- example / Example
- NUMA (Non-uniform Memory Access)
- Numba
- about / Numba, Overview
- reference link / Numba, Numba on AMD APUs
- features / Features of Numba
- LLVM / LLVM
- cross-hardware compatibility / Cross-hardware compatibility
- on CUDA-based GPUs / Numba on the CUDA-based GPUs
- on AMD APUs / Numba on AMD APUs
- NVIDIA graphics card
- avoiding, with CUDA / Working with CUDA without a NVIDIA graphics card
O
- observables
- about / Observables
- observers, creating / Creating observers
- combining / Combining observables
- Zip() example / Zip() example
- example / Output, Output
- merge_all() operator / The merge_all() operator
- observers
- creating / Creating observers
- example / Example, Example 2, Breaking it down, Output
- one-to-one thread mapping / One-to-one thread mapping
- on_error / On_next, on_completed, and on_error in lambda form
- OpenCL / OpenCL
- operating system
- thread, handling / How does the operating system handle threads
- operators
- about / Operators and chaining, The different operators
- filter example / Filter example
- example / Breaking it down
- observables, creating / Creating observables
- observables, transforming / Transforming observables
- observables, filtering / Filtering observables
- observables, error-handling / Error-handling observables
- orphan processes / Orphan processes
P
- Pandas
- paradigm
- reactive libraries / Event-driven and reactive libraries
- parallel execution / Parallel execution
- parallelism
- about / Understanding parallelism
- CPU-bound bottlenecks / CPU-bound bottlenecks
- in CPU / How do they work on a CPU?
- in single-core CPUs / Single-core CPUs
- in clock rate / Clock rate
- Martelli model, of scalability / Martelli model of scalability
- time sharing / Time-sharing - the task scheduler
- in multi-core processors / Multi-core processors
- pipes
- about / Pipes
- anonymous pipes / Anonymous pipes
- named pipes / Named pipes
- working with / Working with pipes
- example / Example
- using / Using pipes
- POSIX threads / POSIX threads
- PriorityQueue
- about / PriorityQueue
- example / Example, Breakdown, Output
- process
- about / Processes
- properties / Properties of processes
- advantages / Properties of processes
- disadvantages / Properties of processes
- lifecycle / The life of a process
- starting, fork used / Starting a process using fork
- spawning / Spawning a process
- forkserver / Forkserver
- daemon processes / Daemon processes
- identifying, PIDs used / Identifying processes using PIDs
- identifying, with example / Example, Output
- terminating / Terminating a process
- terminating, with example / Example
- obtaining / Getting the current process
- subclassing / Subclassing processes
- subclassing, with example / Example, Output
- communication between / Communication between processes
- pipes / Pipes
- pipes, working with / Working with pipes
- exceptions, handling / Handling Exceptions
- process creation
- versus thread creation / Creating processes versus threads
- versus thread creation, example / Breaking it down
- process execution sequence
- solution / The solution
- Process IDentifier (PID)
- about / Forking, Getting the current process
- used, for identifying process / Identifying processes using PIDs
- process pool
- tasks, submitting to / Submitting tasks to a process pool
- map_async / Map_async
- imap / Imap
- imap_unordered / Imap_unordered
- starmaps / Starmap
- starmap_async / Starmap_async
- maxtasksperchild / Maxtasksperchild
- ProcessPoolExecutor
- about / ProcessPoolExecutor
- creating / Creating a ProcessPoolExecutor
- example / Example, Output
- context manager / Context Manager
- exercise / Exercise, Getting started
- computationally bound problems, speed improving / Improving the speed of computationally bound problems
- speed, improving example / Full code sample, Output
- profiling
- about / Profiling
- cProfile / cProfile
- line_profiler tool / The line_profiler tool
- memory profiling / Memory profiling
- program counter (PC) / Multi-core processors
- protocols / Protocols
- PyCSP
- about / PyCSP
- process / Processes in PyCSP
- example / Output
- PyCUDA
- about / PyCUDA, PyCUDA
- reference link / PyCUDA
- features / Features
- example / Simple example
- kernels / Kernels
- GPU arrays / GPU arrays
- PyFunctional
- about / PyFunctional
- installing / Installation and official docs
- references / Installation and official docs
- example / Simple example
- streams function / Streams, transformations, and actions
- transformations function / Streams, transformations, and actions
- action function / Streams, transformations, and actions
- lists, filtering / Filtering lists
- SQLite3, reading / Reading/writing SQLite3
- SQLite3, writing / Reading/writing SQLite3
- compressed files / Compressed files
- parallel execution / Parallel execution
- PyGPU
- reference link / PyGPU
- PyOpenCL
- PyRx
- about / ReactiveX - RxPy
- example / ReactiveX - RxPy, Breaking it down
- Python
- thread / Threads in Python
- thread, handling / Handling threads in Python
- Python, limitations
- about / The limitations of Python
- Jython / Jython
- IronPython / IronPython
- using / Why should we use Python?
- Python 2.7
- concurrent.futures / concurrent.futures in Python 2.7
- Python Debugger (Pdb)
- about / Pdb
- example / An interactive example
- reference link / An interactive example
- PyUnit
Q
- queue objects
- about / Queue objects
- full/empty queues / Full/empty queues
- join() function / The join() function
- extending / Breaking it down
- extending, example / Breaking it down, Output
- queues
- about / Queues, Queues
- FIFO (first in first out) queues / FIFO queues
- LIFO (last in first out) queues / LIFO queues
- PriorityQueue / PriorityQueue
- example / Example, Output
R
- race conditions
- about / Race conditions
- process, execution sequence / Process execution sequence
- Reactive Extensions (RX)
- about / ReactiveX, or RX
- RxPY, installing / Installing RxPY
- observables / Observables
- lambda functions / Lambda functions
- on_next function / On_next, on_completed, and on_error in lambda form
- chaining / Operators and chaining
- operators / Operators and chaining, The different operators
- cold observables / Hot and cold observables
- hot observables / Hot and cold observables
- events, emitting / Emitting events
- multicasting / Multicasting
- observables, combining / Combining observables
- concurrency / Concurrency
- reactive programming
- about / Reactive programming, Basic reactive programming
- PyRx / ReactiveX - RxPy
- purity, maintaining / Maintaining purity
- ReactiveX framework
- PyRx / ReactiveX - RxPy
- regular locks
- versus RLocks / RLocks versus regular locks
- requisites, solution
- about / Requirements
- function requisites / Functional requirements
- non-functional requirements / Non-functional requirements
- result
- obtaining / Getting the result
- example / Example, Output
- RLocks
- about / RLocks
- example / Breaking it down
- versus regular locks / RLocks versus regular locks
- rotation
- about / Rotation
- example / Example, Breaking it down, Output
- Rx flavors
- reference link / ReactiveX, or RX
- RxPY
- installing / Installing RxPY
S
- semaphores
- about / Semaphores, Semaphores and BoundedSemaphores
- class definition / Class definition
- example / Example
- TicketSeller class / The TicketSeller class
- sequential download
- about / Sequential download
- example / Sequential download, Breaking it down
- sequential prime factorization
- about / Sequential prime factorization
- example / Sequential prime factorization, Breaking it down
- sets
- about / Sets
- class, extending / Extending the class
- URL, for example / Extending the class
- primitives, extending / Exercise - extending other primitives
- shared resources
- about / Shared resources and data races
- join method / The join method
- locks / Locks
- RLocks / RLocks
- RLocks, versus regular locks / RLocks versus regular locks
- condition / Condition
- semaphores / Semaphores
- bounded semaphores / Bounded semaphores
- events / Events
- barriers / Barriers
- SIMD (single instruction stream) / SIMD
- single-core CPUs
- about / Single-core CPUs
- advantages / Single-core CPUs
- disadvantages / Single-core CPUs
- single instruction single data (SISD) / SISD
- single thread
- working as / Make it work as a single thread
- solution
- selecting / Designing your systems
- requisites / Requirements
- design aspect / Design
- researching / Research
- SQLite3
- reading / Reading/writing SQLite3
- writing / Reading/writing SQLite3
- standard data structures
- about / Standard data structures
- sets / Sets
- decorator / Decorator
- class decorator / Class decorator
- lists / Lists
- queues / Queues
- queue objects / Queue objects
- deque objects / Deque objects
- elements, appending / Appending elements
- elements, popping / Popping elements
- elements, inserting / Inserting elements
- rotation / Rotation
- state flow chart / State flow chart
- streams function / Streams, transformations, and actions
- sub-processes
- utilizing / Utilizing sub-processes
- example / Example, Output
- about / Sub-processes
- reference link / Sub-processes
- synchronization
- between threads / Synchronization between threads
- system architecture styles
- about / System architecture styles
- SISD / SISD
- SIMD / SIMD
- MISD / MISD
- MIMD / MIMD
T
- tasks
- submitting, to process pool / Submitting tasks to a process pool
- applying / Apply
- apply_async / Apply_async
- map / Map
- about / Tasks
- example / Example
- all_tasks method / The all_tasks(loop=None) method
- current_tasks() function / The current_tasks() function
- cancel() function / The cancel() function
- task scheduler / Time-sharing - the task scheduler
- tasks function
- about / Task functions
- as_completed() function / The as_completed(fs, *, loop=None, timeout=None) function
- ensure_future function / The ensure_future(coro_or_future, *, loop=None) function
- wrap_future function / The wrap_future(future, *, loop=None) function
- gather function / The gather(*coroes_or_futures, loop=None, return_exceptions=False) function
- wait() function / The wait() function
- testing
- strategies / Testing strategies
- need for / Why do we test?
- concurrent software systems / Testing concurrent software systems
- considerations / What should we test?
- unit tests / Unit tests
- concurrent code, unit testing / Unit testing concurrent code
- integration tests / Integration tests
- Theano
- about / Theano, Theano
- reference link / Theano
- requisites / Requirements
- requisites, reference link / Requirements
- example / Getting started, Example
- matrices, adding example / Adding two matrices
- fully-typed constructors / Fully-typed constructors
- using, on GPU / Using Theano on the GPU
- GPUs, leveraging / Leveraging multiple GPUs
- thread
- about / What is a thread?
- types / Types of threads, Different types of threads
- in Python / Threads in Python
- state flow chart / State flow chart
- POSIX threads / POSIX threads
- Windows threads / Windows threads
- starting / The ways to start a thread, Starting a thread
- forking / Forking
- daemonizing / Daemonizing a thread
- daemonizing, example / Breaking it down
- handling, in Python / Handling threads in Python
- loads, starting / Starting loads of threads
- loads, example / Breaking it down
- used, for programs slowing down / Slowing down programs using threads
- example, for slowing down program / Breaking it down
- active thread / Getting the total number of active threads
- active thread, example / Breaking it down
- current thread, obtaining / Getting the current thread
- example, for obtaining current thread / Breaking it down
- enumerating / Enumerating all threads
- enumerating, example / Breaking it down
- identifying / Identifying threads
- identifying, example / Breakdown
- ending / Ending a thread
- ending, best practice / Best practice in stopping threads
- ending, example / Example
- orphan processes / Orphan processes
- handling, by operating system / How does the operating system handle threads
- synchronization / Synchronization between threads
- Dining Philosophers / The Dining Philosophers
- race conditions / Race conditions
- critical sections / Critical sections
- thread-safe communication structures
- defining / Defining your own thread-safe communication structures
- web Crawler example / A web Crawler example
- thread class
- inheriting from / Inheriting from the thread class
- example / Inheriting from the thread class, Breaking it down
- thread creation
- versus processes creation / Creating processes versus threads
- ThreadPoolExecutor
- creating / Creating a ThreadPoolExecutor
- example / Example, Output
- thread state
- about / Thread state
- examples / Python example of thread state, Breaking it down
- TicketSeller class
- example / The TicketSeller class, Output
- thread race / Thread race
- timeit module
- about / The timeit module
- reference link / The timeit module
- versus time module / Timeit versus time
- command-line example / Command-line example
- importing, into code / Importing timeit into your code
- Tornado
- transformations function / Streams, transformations, and actions
- transports
- types / Transports
- about / Transports
- methods / Transports
- turtle
- about / Turtle
- example / Turtle, Breaking it down
- twisted
- about / Twisted
- web server example / A simple web server example
U
- UMA (Uniform Memory Access)
- unit tests
- about / Unit tests
- PyUnit / PyUnit
- test suite, expanding / Expanding our test suite
W
- Wait state / Event-driven programming
- web crawler
- improving / Improving our crawler
- reference link / Improving our crawler, Exercise - capture more info from each page crawl
- info, capturing from page crawl / Exercise - capture more info from each page crawl
- web crawler, improving plans
- about / The plan
- improvement example / New improvements
- code, refactoring / Refactoring our code
- results, storing in CSV file / Storing the results in a CSV file
- web Crawler example
- about / A web Crawler example
- requisites / Requirements
- design / Design
- Crawler class / Our Crawler class
- implementing / Our starting point
- queue object, extending / Extending the queue object
- enhancement / Future enhancements
- conclusion / Conclusion
- testing / Exercise - testing your skills
- web server / Exercise - testing your skills
- Windows threads / Windows threads