<python> 전역 변수 선언???

antz의 이미지

안녕하세요.

python으로 소켓 테스트용 thread 프로그램을 하나 만들고 있습니다.
테스트 성공과 실패로 결과를 개수로 보고 싶은데요.
우선 시험으로 쓰레드 갯수를 세볼려고 allcnt라는 전역변수(?)
를 써서 해보았는데 다음과 같은 에러가 납니다.

조언 부탁드립니다.

Quote:
ine 11, but no encoding declared; see http://www.python.org/peps/pep-0263.html f
or details
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/local/lib/python2.3/threading.py", line 436, in __bootstrap
self.run()
File "testclient.py", line 50, in run
allcnt = allcnt + 1
UnboundLocalError: local variable 'allcnt' referenced before assignment

Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/local/lib/python2.3/threading.py", line 436, in __bootstrap
self.run()
File "testclient.py", line 50, in run
allcnt = allcnt + 1
UnboundLocalError: local variable 'allcnt' referenced before assignment


#!/usr/bin/env python
import sys
import socket
import string
import binascii
import random
from struct import *
from threading import Thread
import time

key = [ "꽃배달", "중화요리", "부동산", "택배", "피자", "이사", "여행사", "렌트카", "여행사", "야식"]
# counter_lock = Lock()
allcnt = 0

class Request(Thread):
	def __init__(self, id, count):
		Thread.__init__(self)
		self.id = id
		self.count = count
#		self.fail_cnt = 0
#		self.success_cnt = 0

	def mkSendMsg(self, pMsg):
        	newMsg = string.replace(pMsg, '^', binascii.unhexlify('1B'))
		return newMsg

	def mkRecvMsg(self, pMsg):
        	newMsg = string.replace(binascii.unhexlify('1B'), pMsg, '^')
		return newMsg

	def run(self): 
		s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		s.connect(("127.0.0.1", 15001))

		odata = "^key=" + key[self.id] + "^do=00^city=^dong=^pnum=1^psize=15^adcount=0^ipg=^ipark=^icoupon=^order=1^mode=0^rndseed=1^dsort=0^dsize=6250000^sx=508167^sy=1104677"
		realdata = self.mkSendMsg(odata)

		datasize=len(realdata)

		N1 = datasize/256
		N0 = datasize%256
		n_major = 103
		n_minor = 21

		send_data = pack("%dsBBBBBB%ds" % (2, 512), "FP", 0, N1, N0, n_major, n_minor, 0, realdata);

#		print calcsize("ccBBBBBB")
#		datasize = datasize + 8;
		s.sendall(send_data)
		allcnt = allcnt + 1
		s.settimeout(0)
		s.setblocking(1)
		data = s.recv(8128, socket.MSG_PEEK)
		token = string.split(data, chr(27))

                if len(token) > 1 :
                        result = string.split(token[1], '=')

                        if result[1] == '0':
                                str_result = "Success"
                        else :
                                str_result = "Fail(Token)"
                else :
                        str_result = "Fail(Data)"


		if data[0] + data[1] == 'FP' :
			datasize = ord(data[3])*256 + ord(data[4])
			r_major = ord(data[5])
			r_minor = ord(data[6])
		
			print "[" + str_result + "] ", r_major, r_minor, datasize
		s.close()

def usage():
	print "testclient [num]"

if len(sys.argv) != 2 :
	usage()
	sys.exit(1)

nthreads = string.atoi(sys.argv[1])

for j in range(60):
	for i in range(nthreads):
		rv = random.randrange(0,9)
		w = Request(rv, 8)
		w.start()
	time.sleep(1)

# print "Result Report"
# print "All : " + counter + ", Success : " + success_cnt + ", Fail : " + fail_cnt
print allcnt
ddt의 이미지

메소드 안에서 allcnt쓰기 전에 global allcnt를 쓰세요.

antz의 이미지

감사합니다. :-)

잘됩니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.