1#!/usr/bin/env python 2 3 4############################################################################# 5## 6## Copyright (C) 2014 Riverbank Computing Limited. 7## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 8## All rights reserved. 9## 10## This file is part of the examples of PyQt. 11## 12## $QT_BEGIN_LICENSE:BSD$ 13## You may use this file under the terms of the BSD license as follows: 14## 15## "Redistribution and use in source and binary forms, with or without 16## modification, are permitted provided that the following conditions are 17## met: 18## * Redistributions of source code must retain the above copyright 19## notice, this list of conditions and the following disclaimer. 20## * Redistributions in binary form must reproduce the above copyright 21## notice, this list of conditions and the following disclaimer in 22## the documentation and/or other materials provided with the 23## distribution. 24## * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor 25## the names of its contributors may be used to endorse or promote 26## products derived from this software without specific prior written 27## permission. 28## 29## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 30## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 31## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 32## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 33## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 34## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 35## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 36## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 37## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 38## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 39## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." 40## $QT_END_LICENSE$ 41## 42############################################################################# 43 44 45import sys 46import random 47 48from PyQt5.QtCore import QCoreApplication, QSemaphore, QThread 49 50 51DataSize = 100000 52BufferSize = 8192 53buffer = list(range(BufferSize)) 54 55freeBytes = QSemaphore(BufferSize) 56usedBytes = QSemaphore() 57 58 59class Producer(QThread): 60 def run(self): 61 for i in range(DataSize): 62 freeBytes.acquire() 63 buffer[i % BufferSize] = "ACGT"[random.randint(0, 3)] 64 usedBytes.release() 65 66 67class Consumer(QThread): 68 def run(self): 69 for i in range(DataSize): 70 usedBytes.acquire() 71 sys.stderr.write(buffer[i % BufferSize]) 72 freeBytes.release() 73 74 sys.stderr.write("\n") 75 76 77if __name__ == '__main__': 78 app = QCoreApplication(sys.argv) 79 producer = Producer() 80 consumer = Consumer() 81 producer.start() 82 consumer.start() 83 producer.wait() 84 consumer.wait() 85