I'm a beginner and use Python 2.7. I want to make the definitions parameters to be changeable so I can controll the pause and string output on the fly. Is this possible? I've read some thread stuff but it seems to be more about executing two tasks at the same time. I want communication between the two tasks during runtime.

    def writeAndPause(stringToWrite,pauseSeconds)
        while True:
            print stringToWrite
            sleep(pauseSeconds)

Any solution or link to documentation is very much appreciated. Thanks for your time! /Karl

有帮助吗?

解决方案

Threads are for simultaneous work. I guess if you just redesign your code you will have the effect you want. Consider removing the while clause from you function and put it outside:

def writeAndPause(stringToWrite,pauseSeconds)
    print stringToWrite
    sleep(pauseSeconds)

And somewhere you call this function:

while True:
    stringToWrite, pauseSeconds = gatherSomeInformation()
    writeAndPause(stringToWrite, pauseSeconds)

其他提示

@Constantinius is right: the answer is almost certainly to redesign your code so you don't need to do something esoteric.

I'll describe another way to do it purely for fun. If you really wanted to keep that while loop inside the function, you can do so with a Yield Expression

For example:

def writeAndPause():
    while True:
        stringToWrite, pauseSeconds = yield
        print stringToWrite
        sleep(pauseSeconds)

This can be used in the following way:

# create the generator
writer = writeAndPause()
# start the generator
writer.next()
# resume execution and send new values into generator
writer.send(('start string', 10))
'start string'
# resume execution and send another set of new values into generator
writer.send(('new string', 20))
'new string'

Now that you've seen it, forget it and do what @Constantinius said.

Does this help you ?

It takes advantage of the characteristics of default argument definition and the fact a list isn't a variable but a collection of reference, in my code only one (shortly said)

from time import sleep,time

stringToWrite = [None]
pauseSeconds = [0]

def writeAndPause(stw = stringToWrite, pz = pauseSeconds, keep = [time()]):
        if stw[0]:
            print stw[0]
        else:
            print 'START'
        print '  having waited ',time()-keep[0],'seconds,    must wait',pz[0],'seconds'
        keep[0] = time()
        sleep(pz[0])


writeAndPause()


for a,b in (('first',1),('second',2.05),('third',3.4),('fourth',0.88),
            ('BANANA',0.2),('APPLE',1.5),
            ('PEAR',0.77),('CHERRY',4),
            ('ORANGE',0.1),('NUT',6),
            ('APRICOT',0.56),('PLUM',2.5)):

    stringToWrite[0] = a
    pauseSeconds[0] = b
    writeAndPause()

result

START
  having waited  0.0310001373291 seconds,    must wait 0 seconds
first
  having waited  0.0320000648499 seconds,    must wait 1 seconds
second
  having waited  1.01600003242 seconds,    must wait 2.05 seconds
third
  having waited  2.15600013733 seconds,    must wait 3.4 seconds
fourth
  having waited  3.42100000381 seconds,    must wait 0.88 seconds
BANANA
  having waited  0.905999898911 seconds,    must wait 0.2 seconds
APPLE
  having waited  0.266000032425 seconds,    must wait 1.5 seconds
PEAR
  having waited  1.51499986649 seconds,    must wait 0.77 seconds
CHERRY
  having waited  0.796999931335 seconds,    must wait 4 seconds
ORANGE
  having waited  4.03200006485 seconds,    must wait 0.1 seconds
NUT
  having waited  0.140000104904 seconds,    must wait 6 seconds
APRICOT
  having waited  6.03099989891 seconds,    must wait 0.56 seconds
PLUM
  having waited  0.765000104904 seconds,    must wait 2.5 seconds
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top